这是关于Python的问题。我有以下词典列表:
listA = [
{"t": 1, "tid": 2, "gtm": "Goofy", "c1": 4, "id": "111"},
{"t": 3, "tid": 4, "gtm": "goofy", "c1": 4, "c2": 5, "id": "222"},
{"t": 1, "tid": 2, "gtm": "GooFy", "c1": 4, "c2": 5, "id": "333"},
{"t": 5, "tid": 6, "gtm": "GoOfY", "c1": 4, "c2": 5, "id": "444"},
{"t": 1, "tid": 2, "gtm": "GOOFY", "c1": 4, "c2": 5, "id": "555"}
]
和我想要比较的词典:
dictA = {"t": 1, "tid": 2, "gtm": "goofy"}
我想创建一个与 listA 中 dictA 中的所有项目匹配的词典列表,并包含“id”字段:
listB = [
{"t": 1, "tid": 2, "gtm": "Goofy", "id": "111"},
{"t": 1, "tid": 2, "gtm": "GooFy", "id": "333"},
{"t": 1, "tid": 2, "gtm": "GOOFY", "id": "555"},
]
如何以不区分大小写的方式比较两个dicts?
答案 0 :(得分:3)
您必须手动测试每个字典值:
def test(d1, d2):
"""Test if all values for d1 match case-insensitively in d2"""
def equal(v1, v2):
try:
return v1.lower() == v2.lower()
except AttributeError:
# not an object that supports .lower()
return v1 == v2
try:
return all(equal(d1[k], d2[k]) for k in d1)
except KeyError:
# d2 is missing a key, not a match
return False
listB = [d for d in listA if test(dictA, d)]
这会产生您正在寻找的3个匹配项:
>>> listA = [
... {"t": 1, "tid": 2, "gtm": "Goofy", "c1": 4, "id": "111"},
... {"t": 3, "tid": 4, "gtm": "goofy", "c1": 4, "c2": 5, "id": "222"},
... {"t": 1, "tid": 2, "gtm": "GooFy", "c1": 4, "c2": 5, "id": "333"},
... {"t": 5, "tid": 6, "gtm": "GoOfY", "c1": 4, "c2": 5, "id": "444"},
... {"t": 1, "tid": 2, "gtm": "GOOFY", "c1": 4, "c2": 5, "id": "555"}
... ]
>>> dictA = {"t": 1, "tid": 2, "gtm": "goofy"}
>>> [d for d in listA if test(dictA, d)]
[{'tid': 2, 'c1': 4, 'id': '111', 't': 1, 'gtm': 'Goofy'}, {'gtm': 'GooFy', 't': 1, 'tid': 2, 'c2': 5, 'c1': 4, 'id': '333'}, {'gtm': 'GOOFY', 't': 1, 'tid': 2, 'c2': 5, 'c1': 4, 'id': '555'}]
>>> from pprint import pprint
>>> pprint(_)
[{'c1': 4, 'gtm': 'Goofy', 'id': '111', 't': 1, 'tid': 2},
{'c1': 4, 'c2': 5, 'gtm': 'GooFy', 'id': '333', 't': 1, 'tid': 2},
{'c1': 4, 'c2': 5, 'gtm': 'GOOFY', 'id': '555', 't': 1, 'tid': 2}]
但这些包括额外的密钥。如果您必须只有某些键,请在新词典中选择这些键:
listB = [dict(dictA, id=d['id'], gtm=d['gtm']) for d in listA if test(dictA, d)]
这会创建dictA
的副本,并添加来自匹配字典的id
和gtm
个键:
>>> [dict(dictA, id=d['id'], gtm=d['gtm']) for d in listA if test(dictA, d)]
[{'tid': 2, 'id': '111', 't': 1, 'gtm': 'Goofy'}, {'tid': 2, 'id': '333', 't': 1, 'gtm': 'GooFy'}, {'tid': 2, 'id': '555', 't': 1, 'gtm': 'GOOFY'}]
>>> pprint(_)
[{'gtm': 'Goofy', 'id': '111', 't': 1, 'tid': 2},
{'gtm': 'GooFy', 'id': '333', 't': 1, 'tid': 2},
{'gtm': 'GOOFY', 'id': '555', 't': 1, 'tid': 2}]