检测/删除列表中的重复值

时间:2016-01-31 14:30:06

标签: python python-2.7

我想确定一个列表是否有重复的值。我怎么能这样做?

我有3组清单:

Link_a =     ['a','b','c']    
Bookmark_a = ['1','2','3']    
Link_b =     ['b','c']    
Bookmark_b = ['4','5']    
Link_c =     ['a']    
Bookmark_c = ['6']

我想将此缩减为一组链接和一组书签,如下所示:

Answer_link_all =     ['a','b','c']    
Answer_bookmark_all = ['7', '6', '8']

我首先尝试link_a + link_b,但我发现这些值会重复:

link_a + link_b   # result: ['a', 'b', 'c', 'b', 'c']

我认为我想要做的就像这个伪代码:

if name is repeat pass    
   or add tag name

但是还有书签要计算,我不知道该如何继续。

4 个答案:

答案 0 :(得分:2)

您最好使用字典而不是标签及其值的断开列表。另外,请考虑使用实际整数作为值,而不是字符串。

这是一个建议:

>>> from collections import Counter
>>> c = Counter()
>>> c.update(dict((x,int(y)) for x,y in zip(Link_a, Bookmark_a)))
>>> c.update(dict((x,int(y)) for x,y in zip(Link_b, Bookmark_b)))
>>> c.update(dict((x,int(y)) for x,y in zip(Link_c, Bookmark_c)))
>>> c
Counter({'c': 8, 'a': 7, 'b': 6})

每当您获得新数据时,请相应地更新您的计数器。像这样访问计数器:

>>> c['a']
7
>>> c['b']
6
>>> c['c']
8

答案 1 :(得分:2)

你可以zip不同的列表对,

Link_a =     ['a','b','c']    
Bookmark_a = ['1','2','3']    
Link_b =       ['b','c']    
Bookmark_b =  ['4','5']    
Link_c =     ['a']    
Bookmark_c = ['6']

zps = [
    zip(Link_a, Bookmark_a),
    zip(Link_b, Bookmark_b),
    zip(Link_c, Bookmark_c),
]

d = dict()
for z in zps:
    for k,v in z:
        v = int(v) # Converting v to a number 
        if k not in d: d[k] = v; continue
        d[k] += v

Answer_link_all = list(d.keys())
Bookmark_link_all = list(d.values())

答案 2 :(得分:1)

我会选择这样的东西:

Link_a =     ['a','b','c']    
Bookmark_a = ['1','2','3']    
Link_b =       ['b','c']    
Bookmark_b =  ['4','5']    
Link_c =     ['a']    
Bookmark_c = ['6']


def to_dict(a,b):
    return {k: int(v) for k, v in zip(a,b)}


def merge_dicts(x,y):
    return { k:x.get(k, 0) + y.get(k, 0) for k in set(x) | set(y) }


res = merge_dicts(to_dict(Link_a, Bookmark_a), to_dict(Link_b, Bookmark_b))
res = merge_dicts(res, to_dict(Link_c, Bookmark_c))

print res

结果:{'a': 7, 'c': 8, 'b': 6}

答案 3 :(得分:1)

这是sets的完美用例,它在Python 3.x中引入,但已被反向移植到Python 2.7。

您当前使用的列表是一系列有序的连续值。如您所见,值可以重复,您必须做额外的工作才能将列表汇总为其唯一值。

与列表一样,集合是值的集合。但是,它们没有订购,它们不是顺序的。此外,在一个集合中,值不能重复。如果向集合添加值,并且它已经是集合的成员,则不会获得重复的值;它仍然只出现在一次。

集合以数学集合为模型。

(以下示例假设Python 2.7 - Python 3中的语法略有不同。)

您可以使用文字符号创建集合:

Link_a = set('abc')     # now: set(['a', 'c', 'b'])

一个警告 - 如果您传递一个字符串,它会将字符串拆分为其组成字母。那是因为在Python中,字符串也是可迭代的。

Link_a = set(('abc',))  # now: set(['abc'])
Link_a = set(['abc'])   # now: set(['abc'])

您可以通过传递单元素元组或列表来解决这个问题。

Link_a = set()                    # now: set([])
Link_a.update(['a', 'b', 'c'])    # now: set(['a', 'c', 'b'])
Link_a.update('d')                # now: set(['a', 'c', 'b', 'd'])
Link_a.update('a')                # now: set(['a', 'c', 'b', 'd'])

您也可以创建一个空集,并在事后添加。

update

正如您所看到的,我们所做的最后一次aa)并未更改该集。 in已经是一个集合成员,所以当我们再次尝试添加它时没有任何反应。

注意:正如您从示例中看到的,集合未订购。如果您依赖于特定顺序的值,则集合可能对您不起作用(或者,您可能需要在使用它们时以某种方式对它们进行排序)。

与列表一样,您可以使用理解,您可以使用'd' in Link_a # True 'z' in Link_a # False 来测试会员资格...

a & b       # Intersection: members which appear in both sets
a | b       # Union: all members from both sets
a - b       # Difference: members which are in a, but not in b
a ^ b       # Exclusive or (XOR): members in either a or b, but not in both

您还可以对集合使用数学运算。

Link_a =     set(['a','b','c'])
Bookmark_a = set(['1','2','3'])
Link_b =     set(['b','c'])
Bookmark_b = set(['4','5'])
Link_c =     set(['a'])
Bookmark_c = set(['6'])

Answer_link_all = set(Link_a | Link_b | Link_c)
Answer_bookmark_all = set(Bookmark_a | Bookmark_b | Bookmark_c)

要将列表合并为一个最终集合,您可以使用联合:

setName = {1, 2, 3, 2, 3, 1}      # result: class 'set': {1, 2, 3}

如果您使用的是Python 3,情况会有所不同。大多数情况都是一样的,除了您还可以使用此文字符号声明集合。

{{1}}