从字典

时间:2018-01-04 08:09:19

标签: python

我有以下字典,

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

6 个答案:

答案 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)}