我有以下字典,
>>> names
{1: ('c1', 1), 2: ('c2', 2), 3: ('c1', 3), 4: ('c2', 4)}
基于值中的第一个条目消除具有重复条目的键的最佳方法是什么,即1和3是重复的,因为'c1'和2和4是重复的,因为'c2'?
我希望最终的输出是这样的
>>> uniqueNames
{1: ('c1', 1), 2: ('c2', 2) }
答案 0 :(得分:5)
类似于在保持列表顺序的同时消除常规列表中的重复项的方法。
这里唯一真正的区别是字典没有顺序,这意味着通过names.items
的迭代顺序是任意的,所以你将保留一个任意的键值对,其值为元组的唯一第一项。 / p>
>>> names = {1: ('c1', 1), 2: ('c2', 2), 3: ('c1', 3), 4: ('c2', 4)}
>>>
>>> seen = set()
>>> unique_names = {}
>>>
>>> for k, (v0, v1) in names.items():
... if v0 not in seen:
... unique_names[k] = (v0, v1)
... seen.add(v0)
...
>>> unique_names
{1: ('c1', 1), 2: ('c2', 2)}
答案 1 :(得分:4)
这些问题往往引发隐秘的单行内容:
unique_names = dict({i[1][0]: i for i in names.items()}.values())
如果您想保证保留最小的密钥:
unique_names = dict({i[1][0]: i for i in sorted(names.items(), reverse=True)}.values())
将旧项目作为值的值收集到不相关的位置,并根据在所述词典中保留为值的项目构建新的dict。
答案 2 :(得分:1)
尝试:
ulist = [] # unique-list
outdict = {} # dict for output
for i in names.items(): # i will be as: (1, ('c1', 1))
if i[1][0] not in ulist:
ulist.append(i[1][0]) # add unique item to unique-list
outdict[i[0]] = i[1] # add entry to output dict
print(outdict)
输出:
{1: ('c1', 1), 2: ('c2', 2)}
答案 3 :(得分:0)
你可以这样解决:
names = {1: ('c1', 1), 2: ('c2', 2), 3: ('c1', 3), 4: ('c2', 4)}
values_set = set()
unique_names = {}
for key, value in names.items():
if value[0] not in values_set:
values_set.add(value[0])
unique_names[key] = value
print(unique_names)
答案 4 :(得分:0)
执行一组第一个元组值,然后知道哪些值是唯一的,您可以从字典中弹出键。
>>> temp = {1: ('a', '1'), 2: ('b', '2'), 3: ('a', '3'), 4: ('b', '4')}
>>> uniques = set()
>>> uniquedict = {}
>>> for key, value in temp.iteritems():
... if value[0] not in uniques:
... uniques.update(value[0])
... uniquedict[key]=value
...
>>>
>>> uniquedict
{1: ('a', '1'), 2: ('b', '2')}
编辑:这是针对python 2.7的,@ mrCarnivore答案是针对python 3的
答案 5 :(得分:0)
您可以使用collections.defaultdict
对所需内容进行分组,并且只获取第一个值:
from collections import defaultdict
d = {1: ('c1', 1), 2: ('c2', 2), 3: ('c1', 3), 4: ('c2', 4)}
groups = defaultdict(list)
for num1, (entry, num2) in d.items():
groups[entry].append((num1, num2))
# defaultdict(<class 'list'>, {'c1': [(1, 1), (3, 3)], 'c2': [(2, 2), (4, 4)]})
result = {v[0][0]:(k, v[0][1]) for k, v in groups.items()}
print(result)
# {1: ('c1', 1), 2: ('c2', 2)}
甚至使用itertools.groupby
:
grouped = [list(g) for _, g in groupby(sorted(d.items(), key = lambda x: x[1][0]), key = lambda x: x[1][0])]
# [[(1, ('c1', 1)), (3, ('c1', 3))], [(2, ('c2', 2)), (4, ('c2', 4))]]
result = {k: v for (k, v) in [x[0] for x in grouped]}
print(result)
# {1: ('c1', 1), 2: ('c2', 2)}