如何使字典列表中的值唯一? [英] How to make values in list of dictionary unique?

查看:22
本文介绍了如何使字典列表中的值唯一?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 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,但是 feature_c 有 3 个不同的值 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() 返回一个列表.


示例/演示 -

<预><代码>>>>导入打印>>>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 = []对于 d 中的 i:如果 tuple([i['feature_a'],i['feature_b'],i['feature_c']]) 不在 see_set 中:new_d.append(i)see_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'}]>>>see_set = set()>>>new_d = []>>>对于 d 中的 i:...如果 tuple([i['feature_a'],i['feature_b'],i['feature_c']]) 不在 see_set 中:... new_d.append(i)... see_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'}]

I have a list of dictionaries in Python, which looks like following:

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}, ...]

What I want to achieve is that to keep the feature_a, _b and _c unique.

For example, if we have 3 entries which have the same feature_a and _b, but have 3 different values of feature_c 100, 100, 150, then after the operation, it should be 100 and 150.

How can I achieve this?

================================================================ UPDATE:

OK, Thanks for Anand's excellent answer, it works perfectly. However, I have a further question.

Suppose we have a new feature_d and the dictionary looks like:

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'}, ...]

and I only want to deduplicate feature_a, _b and _c, but leave feature_d out. How can I achieve this?

Many thanks.

解决方案

If the order of the initial d list is not important , you can take the .items() of each dictionary and convert it into a frozenset() , which is hashable, and then you can convert the whole thing to a set() or frozenset() , and then convert each frozenset() back to dictionary. Example -

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

sets() do not allow duplicate elements. Though you would end up losing the order of the list. For Python 2.x , the list(...) is not needed, as map() returns a list.


Example/Demo -

>>> 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}]


For the new requirement -

However, what if that I have another feature_d but I only want to dedup feature_a, _b and _c

If two entries which have same feature_a, _b and _c, they are considered the same and duplicated, no matter what is in feature_d

A simple way to do this is to use a set and a new list, add only the features you need to the set, and check using only the features you need. Example -

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']]))

Example/Demo -

>>> 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'}]

这篇关于如何使字典列表中的值唯一?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆