मैं दो जेसन फाइलों (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()
"मुझे उम्मीद थी कि आउटपुट में कोई बदलाव नहीं होगा, इसके बजाय मुझे आइटम उपलब्ध है"
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
आप समान सुविधाओं पर 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
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 सूची में समान अनुक्रमणिका रखी जाती है।
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।