从Python中删除字典中项目的重复值

时间:2016-09-14 17:31:33

标签: python dictionary

如何检查并删除字典中项目的重复值? 我有一个大型数据集,所以我正在寻找一种有效的方法。以下是包含副本的字典中值的示例:

'word': [('769817', [6]), ('769819', [4, 10]), ('769819', [4, 10])]

需要成为

'word': [('769817', [6]), ('769819', [4, 10])]

7 个答案:

答案 0 :(得分:1)

此问题基本上归结为从不可删除类型列表中删除重复项,因此无法转换为集合。

一种可能的方法是在构建新的列表值时检查当前值的成员资格。

import itertools

d = {'word': [('769817', [6]), ('769819', [4, 10]), ('769819', [4, 10])]}
for k, v in d.items():
    v.sort()
    d[k] = [item for item, _ in itertools.groupby(v)]

或者,使用groupby()获得更简洁的答案,但可能更慢(列表必须先排序,如果是,则它比进行会员检查更快。)

{'word': [('769817', [6]), ('769819', [4, 10])]}

输出 - > #(" 78 " 0 4 (fontified t face org-table))

答案 1 :(得分:0)

your_list = [('769817', [6]), ('769819', [4, 10]), ('769819', [4, 10])]
new = []
for x in your_list:
    if x not in new: new.append(x)

print(new)    
>>>[('769817', [6]), ('769819', [4, 10])]

答案 2 :(得分:0)

你有一个列表,而不是字典。 Python字典可能只有每个键的一个值。尝试

my_dict = dict([('769817', [6]), ('769819', [4, 10]), ('769819', [4, 10])])

结果:

{'769817': [6], '769819': [4, 10]}

Python字典。有关详细信息https://docs.python.org/3/tutorial/datastructures.html#dictionaries

答案 3 :(得分:0)

Strikethrough在编辑之前应用于原始问题,留给子孙后代: 您根本没有使用dict,只有list两个 - tuple s,其中每个tuple中的第二个元素本身就是{{} 1}}。如果你真的想要一个list

dict

将转换它,并通过键进行统一(因此你最终得到dict([('769817', [6]), ('769819', [4, 10]), ('769819', [4, 10])]) ,虽然它失去了秩序,并且没有注意是否值(sub) - {'769817': [6], '769819': [4, 10]} s)是否唯一(它只保留给定密钥的最后一个配对)。

如果您需要在保留顺序的情况下统一相邻重复项(值对唯一性很重要),并且不需要/需要真正的list,请使用dict

itertools.groupby

如果您需要折叠不相邻的重复项,并且不需要保留顺序(或排序顺序很好),您可以使用import itertools nonuniq = [('769817', [6]), ('769819', [4, 10]), ('769819', [4, 10])] uniq = [k for k, g in itertools.groupby(nonuniq)] # uniq is [('769817', [6]), ('769819', [4, 10])] # but it wouldn't work if the input was # [('769819', [4, 10]), ('769817', [6]), ('769819', [4, 10])] # because the duplicates aren't adjacent 来获得groupby解决方案(而不是天真的解决方案可以创建新列表并通过检查O(n log n)复杂度的新列表中的状态,或O(n^2)基于set但需要转换子{{}的解决方案来避免重复{1}}将数据发送到O(n)以使其可以播放):

list

答案 4 :(得分:0)

这个怎么样: 我只关注列表部分:

d = {'word': [('769817', [6]), ('769819', [4, 10]), ('769819', [4, 10])]}
for k, v in d.items():
    new_list = []
    for item in v:
        if item not in new_list:
            new_list.append(item)
    d[k] = new_list

答案 5 :(得分:0)

您可以根据项目生成的哈希来统一项目。哈希可以是任何内容,排序json.dumpscPickle.dumps。 这个班轮可以根据需要统一你的词典。

>>> d =  {'word': [('769817', [6]), ('769819', [4, 10]), ('769819', [4, 10])]}
>>> import json
>>> { k: { json.dumps(x,sort_keys = True):x for x in v}.values() for k,v in d.iteritems()}
{'word': [('769817', [6]), ('769819', [4, 10])]}

答案 6 :(得分:0)

那怎么样?

    def remove_duplicates(d: dict):
        unique_values = set(d.values())
        o = {}
        for k, v in d.items():
           if v in unique_values:
                o[k] = v
                unique_values.remove(v)
        return o