我是Python的新手。
我正在尝试将字典结果与字典 d 进行比较。如果它等于列表 d 中的字典(除了缺少结果的“名称”键),我应该打印其中一个值(名称),如果不相等则不打印-不匹配。
尤其是: d -词典列表:
[OrderedDict([('name', 'Alice'), ('AAA', '2'), ('BBB', '8'), ('CCC', '3')]), OrderedDict([('name', 'Bob'), ('AAA', '4'), ('BBB', '1'), ('CCC', '5')]),
OrderedDict([('name', 'Charlie'), ('AAA', '3'), ('BBB', '2'), ('CCC', '5')])]
结果-字典:
{'AAA': 4, 'BBB': 1, 'CCC': 5}
由于 results 与字典列表 d 的相似部分相同,因此我应该在该diction列表中返回“ name”(在这种情况下为Bob)>
我正在尝试下面的代码,但似乎不起作用:
for i in range(len(d)):
if key in d[i] != 'name':
for k, v in results.items and d[i].items():
if results.items() == d[i].items():
print(d[i]['name'])
else:
print("No match")
如果您能提供一些更简单,更详细的解释,我会很高兴,因为我还没有进一步介绍:)
谢谢!
答案 0 :(得分:1)
这里是单线:
next((x["name"] for x in d
if results == {k: int(v) for k, v in x.items() if k != 'name'}),
"No match")
# Output: 'Bob'
好的,这并不是很有帮助。让我们调试代码。
for k, v in results.items and d[i].items():
if results.items() == d[i].items():
您的代码中的问题是您正在比较键-值对列表作为序列。不能保证常规字典(non-OrderedDict)会以与OrderedDict相同的顺序为您提供.items()
。取而代之的是,您可以说(有一点点的字典理解:
if {k: int(v) for k, v in d[i].items() if k != 'name'} == result:
print(d[i]["name"])
PS:请使用稍微好一点的for item in items: something(item)
而不是for i in range(len(items)): something(items[i])
构造。结合一点清单/字典理解,您将在第一行得到答案。 :)
答案 1 :(得分:1)
易于理解:
done = False
for di in d:
l = list(di.values())
l.pop(0)
l = [int(i) for i in l]
if l == list(results.values()):
print(di['name'])
done = True
if done == False:
print('no match found')
结果字典的输出:
Bob