检查字典内部列表之间的差异

时间:2019-07-23 11:47:18

标签: python json list dictionary

我正试图从两个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()

“我希望输出不变,但我得到了可用的商品”

3 个答案:

答案 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)

您可以在相似的功能上使用pandasjoining来更有效地完成这项工作。

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
相关问题