检查python列表中的重复项

时间:2015-01-28 21:22:19

标签: python python-2.7

我已经看到了这个问题的很多变化,从简单的删除重复项到查找和列出重复项。即使试图采取这些例子中的点点滴滴也不能得到我的结果。

我的问题是如何检查我的列表是否有重复条目?更好的是,我的列表是否有非零重复?

我有一些想法 -

#empty list
myList = [None] * 9 

#all the elements in this list are None

#fill part of the list with some values
myList[0] = 1
myList[3] = 2
myList[4] = 2
myList[5] = 4
myList[7] = 3

#coming from C, I attempt to use a nested for loop
j = 0
k = 0
for j in range(len(myList)):
    for k in range(len(myList)):
        if myList[j] == myList[k]:
            print "found a duplicate!"
            return

如果这样有效,它会在列表中找到重复(无)。有没有办法忽略None或0的情况?我不在乎两个元素是否为0。

我想到的另一个解决方案是将列表转换为集合并比较集合和列表的长度以确定是否存在重复但是当运行set(myList)时它不仅删除重复项,它还会对它进行排序。我可以有单独的副本,但似乎多余。

7 个答案:

答案 0 :(得分:2)

尝试将实际比较行更改为:

if myList[j] == myList[k] and not myList[j] in [None, 0]:

答案 1 :(得分:2)

我不确定您是否正在尝试确定是否存在重复,或确定重复的项目(如果有)。以下是针对后者的Counter解决方案:

# Python 2.7
from collections import Counter

#
# Rest of your code
#

counter = Counter(myList)
dupes = [key for (key, value) in counter.iteritems() if value > 1 and key]
print dupes

Counter对象将自动计算可迭代列表中每个项目的出现次数。构建dupes的列表理解基本上过滤掉仅出现一次的所有项目,也过滤掉布尔评估为False的项目(这将过滤掉0和None)。

如果您的目的只是确定是否发生了重复(没有列出哪些项目是重复的),您可以使用相同的方法并测试dupes

if dupes:  print "Something in the list is duplicated"

答案 2 :(得分:2)

如果您只是想检查它是否包含重复项。一旦函数找到多次出现的元素,它就会返回一个副本。

my_list = [1, 2, 2, 3, 4]

def check_list(arg):
    for i in arg:
        if arg.count(i) > 1:
            return 'Duplicate'

print check_list(my_list) == 'Duplicate' # prints True

答案 3 :(得分:1)

要删除重复并保持顺序忽略0和无,如果您要保留其他假名值,则需要指定的不是None而不是0:

print [ele for ind, ele in enumerate(lst[:-1]) if ele not in lst[:ind] or not ele] 

如果您只想要第一个副本:

for ind, ele in enumerate(lst[:-1]):
    if ele in lst[ind+1:] and ele:
        print(ele)
        break

或者在集合中看到的商店:

seen = set()
for  ele in lst:
    if ele in seen:
        print(ele)
        break
    if ele:
        seen.add(ele) 

答案 4 :(得分:0)

这里有一些代码可以告诉你如何从集合中删除None和0。

l1 = [0, 1, 1, 2, 4, 7, None, None]

l2 = set(l1)
l2.remove(None)
l2.remove(0)

答案 5 :(得分:0)

我认为,这是我能想到的最简单的解决方案。这应该适用于任何列表。唯一的缺点是它不计算重复项的数量,而只返回True或False

for k, j in mylist:
    return k == j

答案 6 :(得分:0)

您可以使用collections.defaultdict并指定一个条件,例如非零/ Truthy,并指定一个阈值。如果特定值的计数超过阈值,则函数将返回该值。如果不存在这样的值,则该函数返回<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>

False

请注意,在以上示例中,函数from collections import defaultdict def check_duplicates(it, condition, thresh): dd = defaultdict(int) for value in it: dd[value] += 1 if condition(value) and dd[value] > thresh: return value return False L = [1, None, None, 2, 2, 4, None, 3, None] res = check_duplicates(L, condition=bool, thresh=1) # 2 不会考虑bool0违反阈值。例如,您也可以使用None排除等于lambda x: x != 1的值。