Python 循环查找两个字典中的匹配值
我有两个由字典组成的不同文件。我试图循环遍历第一个字典文件中的key('name')only值,并将它们与第二个文件匹配。我似乎得到了错误的输出,因为它通过两个键“name”和“size”循环。我已经研究了几种方法,但是我不想把我的字典转换成一套。我想能够打印出“匹配”或“不匹配”。到目前为止,我已经做了以下工作:Python 循环查找两个字典中的匹配值,python,json,python-2.7,dictionary,Python,Json,Python 2.7,Dictionary,我有两个由字典组成的不同文件。我试图循环遍历第一个字典文件中的key('name')only值,并将它们与第二个文件匹配。我似乎得到了错误的输出,因为它通过两个键“name”和“size”循环。我已经研究了几种方法,但是我不想把我的字典转换成一套。我想能够打印出“匹配”或“不匹配”。到目前为止,我已经做了以下工作: def compare_files(): with open('new.json', 'r') as current_data_file, open('old.json','r')
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}
当前数据为:
{u'size': 1000, u'name': u'a.json'}
{u'size': 1000, u'name': u'b.json'}
{u'size': 1000, u'name': u'c.json'}
以前的数据是:
{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不存在。代码中有几个问题
if value not in data\u previous:
时,您实际上会检查value
是否位于data\u previous
的键中,而不是其值中zip(当前数据文件、预数据文件)
时,您实际上看到的是两个字典的对应对。这里有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”可以帮助您实现的)
编辑:如果您想检查当前项与前一项以及前一项与当前项的对比,您可以执行以下操作(我在打印中添加了一些文本,以澄清发生了什么)
为了避免麻烦,您可以使用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']
如果值不在数据中,是否尝试了
_previous.values():
?通过这种方式,您只需签入值,而不是同时签入键和值。我正在尝试只检查键“name”的值,而不是“size”的值@Bazingaay如果您只想检查密钥“name”
,则不需要检查密钥。另外,如果值不在data\u previous
中,则不会检查data\u previous
的值,而是将data\u current
中的值与键在data\u previous
中的值进行比较。我不确定您的预期输出是什么?我假设这不在问题中。我已经更新了我的问题@roadrunner我怎样才能循环浏览两个不同的文件而不是使用zip。我会有一个嵌套的for循环@QuangHoangYou需要做某种类型的嵌套for,比如在@Karl的答案中。我在您的代码中看到,打印的数据中的值“不匹配”。我如何也打印出数据_previous中值的“不匹配”。它必须打印出data_current和data_previous@KarlIn中不存在的值。在这种情况下,只需打印两次。对照前一个项目的完整列表检查当前项目的每个项目。然后对照当前项目的完整列表检查上一个项目的每个项目。我将用一个小例子更新我的答案
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']