Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从两个字典创建新列表(不区分大小写)_Python_Dictionary - Fatal编程技术网

Python 从两个字典创建新列表(不区分大小写)

Python 从两个字典创建新列表(不区分大小写),python,dictionary,Python,Dictionary,这是一个关于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":

这是一个关于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"}
我想创建一个dicts列表,该列表与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"},
        ]

如何以不区分大小写的方式比较这两个dict?

您必须手动测试每个dictionary值:

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)]
>>> [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}]
这将创建一个
dictA
副本,并从匹配字典中添加
id
gtm
键:

listB = [dict(dictA, id=d['id'], gtm=d['gtm']) for d in listA if test(dictA, d)]
>>> [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}]

这是不一样的。他询问的是
不区分大小写的问题
matching@Ev.Kounis:这次不区分大小写。您尝试了什么?tobias_k它必须匹配“t”、“tid”和“gtm”(不区分大小写)。我忘了在几天前发布的问题中问这个问题@Chris_Rands我试图将listA的内容复制到一个新的列表中,并将键和值的大小写转换为小写,但我想避免创建列表的重复副本。效果非常好!谢谢我也喜欢这样的方式,你可以选择在新的列表中包括哪个键:
listB=[dict(dictA,id=d['id'],gtm=d['gtm']),如果测试(dictA,d)]
或者,你可以使用一组想要的
,并使用类似于
[{k:d[k]的东西来表示d中的k,如果k中的键}表示d中的d…
;这样,像
gtm
这样的键就不必硬编码。