循环查找两个词典中的匹配值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了循环查找两个词典中的匹配值相关的知识,希望对你有一定的参考价值。

我有两个不同的文件,包括字典。我试图仅遍历键('name'),在第一个字典文件中输入值,并将它们与第二个文件匹配。我似乎得到了错误的输出,因为它循环通过键'name'和'size'。我已经看了几种方法,但我不想将我的字典转换成一套。我希望能够打印出“匹配”或“不匹配”。到目前为止我做了以下事情:

def compare_files():

with open('new.json', 'r') as current_data_file, open('old.json','r') as pre_data_file:

    for current_data, previous_data in zip(current_data_file, pre_data_file):

        data_current = json.loads(current_data)
        data_previous = json.loads(previous_data)



        for key, value in data_current.items():
            if value not in data_previous:
                print "No Match"
            else:
                print "Match"

这些是我正在加载的两个json文件:

old.json

{"name": "d.json", "size": 1000}
{"name": "c.json", "size": 1000}
{"name": "b.json", "size": 1000}

new.json

{"name": "a.json", "size": 1000}
{"name": "b.json", "size": 1000}
{"name": "c.json", "size": 1000}

data_current是:

{u'size': 1000, u'name': u'a.json'}
{u'size': 1000, u'name': u'b.json'}
{u'size': 1000, u'name': u'c.json'}

data_previous是:

{u'size': 1000, u'name': u'd.json'}
{u'size': 1000, u'name': u'c.json'}
{u'size': 1000, u'name': u'b.json'}

输出:

No Match
No Match
No Match
No Match
No Match
No Match

我的预期输出是:

No Match
Match
Match

b.json和c.json都存在于两者中,但a.json和d.json不存在。

答案

为了避免麻烦,您可以使用pandas(第三方库)直接读取数据,并且可以非常轻松地进行分析

import pandas as pd

df=pd.DataFrame('new.json')
df2=pd.DataFrame('old.json')

df.name.isin(df2.name).replace({False:'No Match',True:'Match'}).tolist()

产量

['No Match', 'Match', 'Match']
另一答案

您的代码中存在一些问题。

  1. 当你做if value not in data_previous:时,你实际上检查value是否在data_previous的键中,而不是在其值中。
  2. 当你做zip(current_data_file, pre_data_file)时,你实际上是在查看两个词典的相应对。在这里,你有3个词典,每个词有2个键,这就是为什么你有6个输出行而不是3个。换句话说,你是成对查找数据,而不是将数据中的每个字典与另一个中的所有其他字典进行比较。数据。

这是一个示例代码:

def compare_files():
    with open('new.json', 'r') as current_data_file, open('old.json','r') as pre_data_file:
        # load both data 
        data_currents = [json.loads(line) for line in current_data_file]
        data_previous = [json.loads(line) for line in pre_data_file]

        # store the previous names for convenient lookup
        pre_names = set([data["name"] for data in data_previous])

        # loop through all current data for matching names
        for data in data_currents:
            print("Match" if data["name"] in pre_names else "No Match")
另一答案

你必须将每个“当前”项目与所有“之前”项目进行比较,而不仅仅是同一位置的项目(这是“zip”可以帮助你实现的)

data_current = [{"name": "d.json", "size": 1000},
                {"name": "c.json", "size": 1000},
                {"name": "b.json", "size": 1000}]

data_previous = [{"name": "a.json", "size": 1000},
                 {"name": "b.json", "size": 1000},
                 {"name": "c.json", "size": 1000}]

for current in data_current:
    result = "No Match"
    for previous in data_previous:
        if current["name"] == previous["name"]:
            result = "Match"
    print(result)

编辑:如果你想检查当前的项目与之前和之前的当前项目,你可以做以下(我已经在打印件中添加了一些文字说明发生了什么)

checks_to_run = [
    {
        "from": data_current,
        "from_name": "current", #Added for transparency
        "against": data_previous,
        "against_name": "previous", #Added for transparency
    },
    {
        "from": data_previous,
        "from_name": "previous", #Added for transparency
        "against": data_current,
        "against_name": "current", #Added for transparency
    }
]

for check_to_run in checks_to_run:
    for check_from in check_to_run["from"]:
        result = "No Match"
        for check_against in check_to_run["against"]:
            if check_from["name"] == check_against["name"]:
                result = "Match"
        print("result for item {} from {} compared to items in {}: {}".format(check_from["name"],
                                                                              check_to_run["from_name"],
                                                                              check_to_run["against_name"],
                                                                              result))

以上是关于循环查找两个词典中的匹配值的主要内容,如果未能解决你的问题,请参考以下文章

如何在嵌套循环中匹配来自两个字符串向量的字符串值

WPF比较两个数据表以查找匹配值

如果条件匹配两个“for 循环”中的两个字符串

我们如何在匹配两个文本文件时查找和替换单词?

正向_逆向匹配分词

如果主工作簿与主工作簿匹配,则从工作簿中查找和循环并复制值