当前位置: 首页 > 面试题库 >

如何使字典列表中的值唯一?

汪德明
2023-03-14
问题内容

我有一个Python字典列表,如下所示:

d = [{feature_a:1, feature_b:'Jul', feature_c:100}, {feature_a:2, feature_b:'Jul', feature_c:150}, {feature_a:1, feature_b:'Mar', feature_c:110}, ...]

我想实现的是保持feature_a_b_c独特的。

例如,如果我们有3项具有相同feature_a_b,但有3个不同的值feature_c
100100150,则操作之后,它应该是100150

我该如何实现?

================================================== =============更新:

好的,感谢Anand的出色回答,它可以完美运行。但是,我还有一个问题。

假设我们有一个新feature_d字典,字典如下:

d = [{feature_a:1, feature_b:'Jul', feature_c:100, feature_d:'A'}, {feature_a:2, feature_b:'Jul', feature_c:150, feature_d: 'B'}, {feature_a:1, feature_b:'Mar', feature_c:110, feature_d:'F'}, ...]

我只想重复数据删除feature_a_b并且_c,但是离开feature_d了。我该如何实现?

非常感谢。


问题答案:

如果初始d列表的顺序不重要,则可以将.items()每个词典的转换为frozenset(),然后将其转换为可哈希的,然后将整个内容转换为set()frozenset(),然后再将其转换frozenset()回词典。范例-

uniq_d = list(map(dict, frozenset(frozenset(i.items()) for i in d)))

sets()不允许重复的元素。虽然您最终会失去列表的顺序。对于Python 2.x,list(...)不需要,因为会map()返回一个列表。

示例/演示-

>>> import pprint
>>> pprint.pprint(d)
[{'feature_a': 1, 'feature_b': 'Jul', 'feature_c': 100},
 {'feature_a': 2, 'feature_b': 'Jul', 'feature_c': 150},
 {'feature_a': 1, 'feature_b': 'Mar', 'feature_c': 110},
 {'feature_a': 1, 'feature_b': 'Jul', 'feature_c': 100},
 {'feature_a': 1, 'feature_b': 'Jul', 'feature_c': 150}]
>>> uniq_d = list(map(dict, frozenset(frozenset(i.items()) for i in d)))
>>> pprint.pprint(uniq_d)
[{'feature_a': 1, 'feature_b': 'Jul', 'feature_c': 100},
 {'feature_a': 1, 'feature_b': 'Jul', 'feature_c': 150},
 {'feature_a': 1, 'feature_b': 'Mar', 'feature_c': 110},
 {'feature_a': 2, 'feature_b': 'Jul', 'feature_c': 150}]

对于新要求-

但是,如果我还有另一个feature_d但我只想删除feature_a,_b和_c怎么办?

如果两个具有相同feature_a,_b和_c的条目,则无论feature_d中的内容如何,​​都将它们视为相同且重复的条目

一种简单的方法是使用集合和新列表,仅将所需的功能添加到集合中,然后仅使用所需的功能进行检查。范例-

seen_set = set()
new_d = []
for i in d:
    if tuple([i['feature_a'],i['feature_b'],i['feature_c']]) not in seen_set:
        new_d.append(i)
        seen_set.add(tuple([i['feature_a'],i['feature_b'],i['feature_c']]))

示例/演示-

>>> d = [{'feature_a':1, 'feature_b':'Jul', 'feature_c':100, 'feature_d':'A'},
...  {'feature_a':2, 'feature_b':'Jul', 'feature_c':150, 'feature_d': 'B'},
...  {'feature_a':1, 'feature_b':'Mar', 'feature_c':110, 'feature_d':'F'},
...  {'feature_a':1, 'feature_b':'Mar', 'feature_c':110, 'feature_d':'G'}]
>>> seen_set = set()
>>> new_d = []
>>> for i in d:
...     if tuple([i['feature_a'],i['feature_b'],i['feature_c']]) not in seen_set:
...         new_d.append(i)
...         seen_set.add(tuple([i['feature_a'],i['feature_b'],i['feature_c']]))
...
>>> pprint.pprint(new_d)
[{'feature_a': 1, 'feature_b': 'Jul', 'feature_c': 100, 'feature_d': 'A'},
 {'feature_a': 2, 'feature_b': 'Jul', 'feature_c': 150, 'feature_d': 'B'},
 {'feature_a': 1, 'feature_b': 'Mar', 'feature_c': 110, 'feature_d': 'F'}]


 类似资料:
  • 问题内容: 我有一个清单: 我不止一次要从列表中删除它。我的结果应该是: 注意: 此处无法正常工作并引发错误。 问题答案: 如果您的值是可哈希的,那么它将起作用: 编辑: 我尝试了一下,没有重复,它似乎工作正常 和

  • 问题内容: 如何在Python中获取字典中的值列表? 在Java中,将Map的值作为列表获取就像在操作中一样容易。我想知道Python中是否有类似的简单方法可以从字典中获取值列表。 问题答案: 是的,这与Python 2 完全相同: 在Python 3中 (在其中返回字典值的 视图 ):

  • 我有一个非常大(约10万)的字典列表: 给定一个ID(例如),我如何以有效的方式找到相应的?我必须为每个列表多次这样做(我有几个这样的大列表,每个列表我有几个令牌ID)。 我目前正在遍历列表中的每个词典,检查是否与我的输入ID匹配,如果匹配,我将获得

  • 问题内容: 假设我有一张桌子: 我需要获取仅提及一次的名称(在本例中为:乍得和蒂姆)。查询的是什么?谢谢。 问题答案: 您可以使用: Rextester演示

  • 问题内容: 我有一个字典列表,我需要从字典的给定键中获取值的列表(所有字典都具有相同的键)。 例如,我有: 我需要得到1,2,3 当然,我可以通过以下方式获得它: 但是我想找到一种更好的方法。 问题答案: 使用简单的列表推导(如果您确定每个字典都有键): 否则,您需要首先检查是否存在:

  • 我想更改字典的纬度和经度值。 它正在抛出以下错误消息: 对于此它在targetWaypoints内打印一个完整的字典。我想打印纬度值。 提前谢谢。