筛选多个键集上的python词典列表

2024-05-20 21:00:27 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有字典:

my_dict = [
        {'first': 'James', 'middle': 'Smith', 'last': 'Joule'}, 
        {'first': 'James', 'middle': 'smith', 'last': 'joule'},
        {'first': 'Christian', 'middle': 'Edward', 'last': 'Doppler'},
        {'first': 'Robert', 'middle': 'Edward', 'last': 'Antonio'},
        {'first': 'Robert', 'middle': 'edward', 'last': 'antonio'},
        {'first': 'Robert', 'middle': 'edwrd', 'last': 'Antonio'},
        {'first': 'James', 'middle': 'Jackson', 'last': 'harden'}, 
        {'first': 'James', 'middle': 'jackson', 'last': 'Harden'},
      ]

我有一个叫做钥匙的清单:

keys = ["first", "last"]

我想根据键中的每个值过滤myDict,这将导致

filtered_dict = [
        {'first': 'James', 'middle': 'Smith', 'last': 'Joule'}, 
        {'first': 'Christian', 'middle': 'Edward', 'last': 'Doppler'},
        {'first': 'Robert', 'middle': 'Edward', 'last': 'Antonio'},
        {'first': 'James', 'middle': 'Jackson', 'last': 'harden'}
      ]

正如您在myu dict list的列表字典中所观察到的,重复的dict值会从列表中删除或过滤掉,并且只有该dict实例的第一个条目会被带到过滤后的输出中。你知道吗

如果两个键的值相同,我需要删除重复项。你知道吗

用Python理解字典/列表有没有一种简单的方法?有没有其他更快的方法来实现这一点?你知道吗


Tags: middle列表字典robertdictfirstlastsmith
2条回答

您可以通过使用key(x["first"].lower, x["last"].lower())按分组,然后只取分组值的第0个元素:

from itertools import groupby
# https://docs.python.org/3/library/itertools.html#itertools.groupby

my_dict = [
        {'first': 'James', 'middle': 'Smith', 'last': 'Joule'}, 
        {'first': 'James', 'middle': 'smith', 'last': 'joule'},
        {'first': 'Christian', 'middle': 'Edward', 'last': 'Doppler'},
        {'first': 'Robert', 'middle': 'Edward', 'last': 'Antonio'},
        {'first': 'Robert', 'middle': 'edward', 'last': 'antonio'},
        {'first': 'Robert', 'middle': 'edwrd', 'last': 'Antonio'},
        {'first': 'James', 'middle': 'Jackson', 'last': 'harden'}, 
        {'first': 'James', 'middle': 'jackson', 'last': 'Harden'},
      ]

keys = ["first","last"]

k = [list(data)[0] for key,data in groupby(my_dict, 
                                           key=lambda x: tuple(x[i].lower() for i in keys))]

print(k) 

输出:

[{'first': 'James', 'middle': 'Smith', 'last': 'Joule'}, 
 {'first': 'Christian', 'middle': 'Edward', 'last': 'Doppler'}, 
 {'first': 'Robert', 'middle': 'Edward', 'last': 'Antonio'}, 
 {'first': 'James', 'middle': 'Jackson', 'last': 'harden'}]

警告:

Groupby只适用于连续键-如果在列表末尾有第三个{'first': 'James', 'middle': 'Smith', 'last': 'JOUle'},他会得到它自己的条目:

Make an iterator that returns consecutive keys and groups from the iterable
(from the doku, link above)

如果您希望所有列表都在同一个组中,则需要先对列表进行排序,然后依次进行分组。你知道吗

下面的解决方案不需要任何import语句,并且能够区分大小写。它还只考虑键列表中提供的字段,并在匹配时忽略所有其他字段(the solution provided by Mstaino在匹配时考虑所有字段,而不管键列表中可能有什么)。你知道吗

my_dict = [
        {'first': 'James', 'middle': 'Smith', 'last': 'Joule'}, 
        {'first': 'James', 'middle': 'smith', 'last': 'joule'},
        {'first': 'Christian', 'middle': 'Edward', 'last': 'Doppler'},
        {'first': 'Robert', 'middle': 'Edward', 'last': 'Antonio'},
        {'first': 'Robert', 'middle': 'edward', 'last': 'antonio'},
        {'first': 'Robert', 'middle': 'edwrd', 'last': 'Antonio'},
        {'first': 'James', 'middle': 'Jackson', 'last': 'harden'}, 
        {'first': 'James', 'middle': 'jackson', 'last': 'Harden'},
      ]
keys = ["first","last"]
fields = [''.join([x.lower() for x in \
                   list(map(lambda x : my_dict[i].__getitem__(x), keys))]) \
          for i,v in enumerate(my_dict)]
filtered_dict = [my_dict[i] for i,v in enumerate(fields) if fields.index(v) == i]

如果只想消除连续的重复(如the solution provided by Patrick Artner),则必须按以下方式声明filtered_dict

filtered_dict = [ my_dict[i] for i,v in enumerate(fields) if i == 0 or v != fields[i-1] ]

相关问题 更多 >