繁体   English   中英

检查python列表中的重复项

[英]check for duplicates in a python list

我已经看到了这个问题的许多变体,从删除重复项到查找并列出重复项之类的简单操作。 甚至尝试采用这些示例中的点点滴滴也无法获得我的结果。

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

我有一些想法-

#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)时,它不仅会删除重复项,还会对其进行排序。 我可以有单独的副本,但似乎多余。

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

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

我不确定您是要确定是否存在重复项,还是要确定重复项(如果有)。 这是针对后者的基于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"

如果您只是想检查它是否包含重复项。 一旦函数发现一个元素出现多次,它将作为重复元素返回。

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

要删除重复数据并保持顺序忽略0和None,如果要保留其他falsey值,则需要指定不为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) 

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

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

您可以使用collections.defaultdict并指定一个条件,例如非零/ Truthy,并指定一个阈值。 如果特定值的计数超过阈值,则函数将返回该值。 如果不存在这样的值,则该函数返回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

注意,在上面的示例中, bool函数对于阈值违反将不考虑0None 您还可以使用例如lambda x: x != 1排除等于1值。

以下是一些代码,将向您展示如何从集合中删除None和0。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM