【问题标题】:How to make values in list of dictionary unique?如何使字典列表中的值唯一?
【发布时间】:2015-10-28 10:48:13
【问题描述】:

我有一个 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_c100100150,那么在操作之后,它应该是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 排除在外。我怎样才能做到这一点?

非常感谢。

【问题讨论】:

  • 听起来您使用了错误的布局。为什么没有字典,其中键是特征,值是 sets?

标签: python unique


【解决方案1】:

如果初始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'}]

【讨论】:

  • 嗨,阿南德,感谢您的回答,它运行良好。但是,如果我有另一个 feature_d 但我只想删除 feature_a_b_c,该怎么办?非常感谢。
  • 你能用一个示例字典更新这个问题吗?
  • 假设两个元素具有feature_a_b_c 相同但不同_d 那么会发生什么?它们是否被认为是重复的?
  • 是的,如果两个条目具有相同的feature_a_b_c,则无论feature_d 中的内容是什么,它们都被视为相同且重复。
  • 是的,set 比 list 快得多,你自己试试吧。你会看见。创建一个包含 100000 个项目的列表并创建一个包含 100000 个项目的集合并尝试做 elem in listelem in set
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多