【问题标题】:Remove duplicate from list which is used as value in dictionary从列表中删除重复项,该列表用作字典中的值
【发布时间】:2014-12-10 04:26:59
【问题描述】:

我有一本字典,其中包含值作为列表。我想从此列表中删除重复项。

{(2,): ['a', 'a', 'b', 'b'], (3,): ['c', 'c'], (1,): ['a', 'b', 'b'], (4,): ['b', 'c', 'd']}

这个字典应该返回 {2:['a','b'], 1:['a','b'], 4('b','c','d')}。只有在创建或合并字典时,我才能找到答案。就我而言,由于列表中有多个输入,因此它不起作用。有没有办法改变原始代码或最后添加一些东西以获得没有重复的字典?我得到这本字典的原始代码如下。

from itertools import izip

a = [1,1,1,2,2,2,2,3,3,4,4,4]
b = ['a','b','b','a','a','b','b','c','c','b','c','d']

d = {} # Create dictionary

def solve(*lists):  

    for i, k in enumerate(izip(*lists)): # check and returns an iterator that combines the elements of lists into tuples
        global d                         
        d.setdefault(k, []).append(b[i])
         #If key is in the dictionary, return its value and append item from other list in the same position 
    return d      

solve(a)
print d

我是 Python 初学者,因此我们将不胜感激。我找到的最接近的答案是 Python remove duplicate value in a combined dictionary's list ,但由于输入是字典而不是列表,我不知道该怎么做。

研究目的:

我有一份 CAD 图纸列表和分配给它们的字母(这是列表 b)。列表 a 是真实对象的列表,并为它们分配了编号。如果相同的图纸和对象在数据库中重复,那没关系。问题是当两个图形分配给一个对象时。在我的情况下,如果两个列表中相同位置的项目重复,这不是问题。 3c 只是重复,不会引起问题。 3c可以从我的研究中忽略。 3c 将是我们有两个相同的对象和两个相同的图纸的情况,因此没有冲突。 “2”是分配给真实对象的数字,“a”是用于绘图的字母。问题是当有一个真实对象和两个不同的图形分配给同一对象时。它会导致零件生产中的错误。 (2, a), (2, b) 是个问题。

【问题讨论】:

  • [] 替换为set(),将append() 替换为add()
  • 列表中的项目顺序重要吗?
  • 当我按照你说的做时 (d.setdefault(k, set()).add(b[i]) 我得到 {(2,): set(['a', 'b ']), (3,): set(['c']), (1,): set(['a', 'b']), (4,): set(['c', 'b ', 'd'])} 是否可以删除单词 'set' 和 (3,): set(['c']), ??
  • 那是 Python 2 中 set 对象的表示,不用担心。如果出于某种原因(例如索引)最终需要列表,那么最后循环遍历字典并在每个值上调用 list()
  • 谢谢阿什维尼乔杜里

标签: python list dictionary unique-values


【解决方案1】:
dic = {(2,): ['a', 'a', 'b', 'b'], (3,): ['c', 'c'], (1,): ['a', 'b', 'b'], (4,): ['b', 'c', 'd']}

for i in dic:
    dic[i] = list(set(dic[i]))

你得到

>>> 
{(2,): ['b', 'a'], (3,): ['c'], (1,): ['b', 'a'], (4,): ['d', 'b', 'c']}
>>> 

这是因为我们首先将其转换为集合,然后将其转换为列表,并在此过程中删除重复项。

【讨论】:

  • 是否可以删除 (3,): ['c'] ?
  • 可以自动完成而不是手动完成类似:: for v in dic: if len(v) in dic
  • 有趣的问题。我不认为它可以以这种方式自动完成,因为当您遍历字典时,字典的大小会改变并且程序会吐出错误。解决方法是,先通过dic2 = dic.copy()创建字典的副本,然后继续for v in dic2: if len(dic[v]) < 2: del dic[v]
【解决方案2】:

你可以使用set

>>> d={(2,): ['a', 'a', 'b', 'b'], (3,): ['c', 'c'], (1,): ['a', 'b', 'b'], (4,): ['b', 'c', 'd']}
>>> {i:list(set(v)) for i,v in d.items()}
{(2,): ['a', 'b'], (3,): ['c'], (1,): ['a', 'b'], (4,): ['c', 'b', 'd']}

【讨论】:

  • 是否可以删除 (3,): ['c'] ?
  • @Kubix 你想怎么删除呢?有什么逻辑吗?
  • 类似:for v in d: if len(v) in d
猜你喜欢
  • 2012-02-16
  • 2016-03-13
  • 2022-11-27
  • 2016-03-14
  • 1970-01-01
  • 2019-09-08
  • 2017-08-13
相关资源
最近更新 更多