Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python列表中检查重复项_Python_Python 2.7 - Fatal编程技术网

在python列表中检查重复项

在python列表中检查重复项,python,python-2.7,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

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

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

我有一些想法-

#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

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


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

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

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

这里有一些代码将向您展示如何从集合中删除None和0

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

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

我不确定您是否试图确定是否存在重复项,或者确定重复项(如果有)。以下是针对后者的基于
计数器的解决方案:

# 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
计数器
对象将自动计算iterable列表中每个项目的发生次数。构建
dups
的列表理解基本上过滤掉只出现一次的所有项目,以及布尔值为
False
的项目(这将过滤掉0和

如果您的目的只是识别已发生的重复(而不列举重复的项目),则可以使用相同的方法测试重复项

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

若要删除DUP并保持忽略0和无的顺序,如果要保留其他虚假值,则需要指定为“非无”和“非0”:

print [ele for ind, ele in enumerate(lst[:-1]) if ele not in lst[:ind] or not ele] 
如果您只需要第一个dup:

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
您可以使用并指定一个条件,例如非零/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 不会考虑<代码> 0 或<代码> No.< /代码>。您还可以使用,例如,
lambda x:x!=1
要排除等于
1

的值,您走对了!我绝对推荐使用
set
操作,因为它是一个函数调用,可以得到您所需要的;然后可以从最后一个集合中弹出
None
s和
0
s,但是总是有
return
outoffunction=syntax error您还需要检查您没有将索引与自身进行比较,并且在比较索引的两次过程中都没有派生出2个重复项(例如,不要计算2个重复项,因为3是4的重复项,但4也是3的重复项)“是否有方法忽略None或0大小写?”确定:
如果myList[i]为None或myList[i]= 0:继续< /代码>谢谢,但是如果我想要第二个副本怎么办?“MikeIssa,那么第二次出现吗?它只会真正意义上你想要索引或基于第二个出现时重新排序,如果你有一个具体的例子,它很容易实现,用<代码>集合。计数器< /代码>请考虑解释你的回答。这如何告诉你是否有任何真实的元素是重复的?