我正试图从两个json文件(olddata和actual_products)中获得区别。脚本的问题是输出,应该是“ no change”,而不是y [“ link”]。
我的jsonfile(olddata,另一个是相同的)示例:
[{
"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()
“我希望输出不变,但我得到了可用的商品”
答案 0 :(得分:1)
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 :(得分:1)
如果要使用代码,请将函数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
答案 2 :(得分:0)
您可以在相似的功能上使用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