如何检查并删除字典中项目的重复值? 我有一个大型数据集,所以我正在寻找一种有效的方法。以下是包含副本的字典中值的示例:
'word': [('769817', [6]), ('769819', [4, 10]), ('769819', [4, 10])]
需要成为
'word': [('769817', [6]), ('769819', [4, 10])]
答案 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.dumps
或cPickle.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