मैं दो जेसन फाइलों (olddata और real_products) से अंतर प्राप्त करने का प्रयास कर रहा हूं। स्क्रिप्ट की समस्या आउटपुट है, यह "कोई बदलाव नहीं" होना चाहिए, इसके बजाय मुझे y ["लिंक"] मिल रहा है।

मेरे jsonfile का उदाहरण (पुराना डेटा, दूसरा वही है):

[{
    "status": "sold_out",
    "link": "https://www.off---white.com/en/IT/men/products/omaa076t19e740660110#",
    "ids": "product_26781",
    "title": "\nOFF-WHITE\u2122 X NIKE T-SHIRT\n"
},
{
    "status": "sold_out",
    "link": "https://www.off---white.com/en/IT/men/products/omaa076t19e740661001#",
    "ids": "product_26782",
    "title": "\nOFF-WHITE\u2122 X NIKE T-SHIRT\n"
},
{
    "status": "in_stock",
    "link": "https://www.off---white.com/en/IT/men/products/omaa076t19e740661910#",
    "ids": "product_26783",
    "title": "\nOFF-WHITE\u2122 X NIKE T-SHIRT\n"
}]

मेरे कोड का उदाहरण:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json

def load_data(file):
    with open(file) as f:
        return(json.load(f))

def save_new_data(data, file):
    with open(file, 'w') as f:
        json.dump(data, f, indent=4)

class ABC():
    def __init__(self):
        self.old_data = load_data('olddata.json')
        self.actual_products = load_data('newdata.json')

    def checkdiff(self):
        for x in self.old_data:
            for y in self.actual_products:
                if(x['status'] == "sold_out" and y['status'] == "in_stock"):
                    print("The item is available:", y["link"])
                else:
                    print("no change")

def main():
    s = ABC()
    s.checkdiff()

if __name__ == "__main__":
    main()

"मुझे उम्मीद थी कि आउटपुट में कोई बदलाव नहीं होगा, इसके बजाय मुझे आइटम उपलब्ध है"

1
Phil 23 जुलाई 2019, 14:47

3 जवाब

सबसे बढ़िया उत्तर

यदि आप अपने कोड का उपयोग करना चाहते हैं, तो अपने फ़ंक्शन checkdiff को इसमें बदलें:

def checkdiff(self):
    for i in range(len(self.old_data)):
        if(self.old_data[i]['status'] == "sold_out" and self.actual_products[i]['status'] == "in_stock"):
            print("The item is available:", self.actual_products[i]["link"])
        else:
            print("no change")

आउटपुट:

no change
no change
no change
1
ncica 23 जुलाई 2019, 15:22

आप समान सुविधाओं पर pandas और joining का उपयोग करके इसे और अधिक कुशलता से पूरा कर सकते हैं।

pip install pandas अगर आपके पास अभी तक नहीं है।

import pandas as pd

df = pd.DataFrame(new_data)
df1 = pd.DataFrame(old_data)

df.head()

             ids                                               link    status                          title
0  product_26781  https://www.off---white.com/en/IT/men/products...  sold_out  \nOFF-WHITE™ X NIKE T-SHIRT\n
1  product_26782  https://www.off---white.com/en/IT/men/products...  sold_out  \nOFF-WHITE™ X NIKE T-SHIRT\n
2  product_26783  https://www.off---white.com/en/IT/men/products...  in_stock  \nOFF-WHITE™ X NIKE T-SHIRT\n

joined = pd.merge(df, df1, how='left', on='ids', suffixes=('_new', '_old'))

joined.where(joined.status_new != joined.status_old).link_new.dropna()
Series([], Name: link_new, dtype: object)

joined.where(joined.status_new == joined.status_old).link_new.dropna() 
0    https://www.off---white.com/en/IT/men/products...
1    https://www.off---white.com/en/IT/men/products...
2    https://www.off---white.com/en/IT/men/products...
Name: link_new, dtype: object
0
gold_cy 23 जुलाई 2019, 15:06

checkdiff का तर्क गलत है:

for x in self.old_data:
    for y in self.actual_products:

9 (x,y) जोड़े पर लूप होगा जहां x old_data में है और y actual_products में है। इसलिए जब आप पहली सूची के पहले आइटम की दूसरी सूची के दूसरे आइटम से तुलना करते हैं तो यह विफल हो जाएगा।

आप जो चाहते हैं वह शायद है

for x, y in zip(self.old_data, self.actual_products):

जो 3 (x, y) जोड़े पर लूप करेगा जहां JSON सूची में समान अनुक्रमणिका रखी जाती है।

1
Leporello 23 जुलाई 2019, 14:58