我很好奇我将如何检查列表中的2个数字是否相同。例如,
myList=[1,7,9,3,1,2,8]
在这种情况下,“myList”中会重复“1”。
如何创建一个程序来检查列表中的两个数字是否相同(重复)。尝试使用循环,这样我就能理解,因为我还没有学过复杂的函数。
答案 0 :(得分:9)
from collections import Counter
myList = [1, 7, 9, 3, 1, 2, 8]
counter = Counter(myList)
print(counter) # prints 'Counter({1: 2, 2: 1, 3: 1, 7: 1, 8: 1, 9: 1})'
使用Collections.Counter
,您知道在源列表myList
的每个元素中重复了多少次。
之后,您可以使用简单的list comprehension
来了解重复的元素:
result = [i for i, j in counter.items() if j > 1]
print(result) # prints '[1]'
答案 1 :(得分:6)
如果你想使用循环,你必须使用你已经看过的列表或一组数字。然后在循环时,如果已经看到该号码,则使用in
运算符进行检查。
seen = []
for number in myList:
if number in seen:
print "Number repeated!"
else:
seen.append(number)
set
不允许重复,因此它非常适合这种算法。正如评论中所提到的,检查元素是否在集合中的时间复杂度对于平均情况(O(1))是不变的,因此如果你有很多数字,这会更有效。
seen = set()
for number in myList:
if number in seen:
print "Number repeated!"
seen.add(number) # won't duplicate
我会说最pythonic的方式是使用collections.Counter
,但其他答案已经涵盖了这一点。要使用内置功能,您可以生成一组使用generator expression和set
多次出现的数字。
In [39]: seen = set()
In [40]: print list(set(x for x in myList if x in seen or seen.add(x)))
[1]
此处表达式将遍历myList
中的所有值,并将其添加到名为set
的{{1}}(如果已经看到它们)。最终,它会将结果集转换为列表并打印内容。
答案 2 :(得分:3)
您可以使用内置的set()
函数将列表转换为集合,集合不能重复。因此,如果“设置”和“列表”的大小不同,则“列表”会重复。
if len(myList) != len(set(myList)):
print "duplicates"
这假设您不关心副本是什么,您只想知道是否存在1个或多个副本。
答案 3 :(得分:1)
您可以将列表转换为集合
myset = set(mylist)
并检查长度是否不同。如果是这样,那就重复了。
这是因为如果几个元素相等,一个集合只会使每个元素都有一次 - 就像数学意义上的集合一样。
如果您不需要知道哪个号码是重复的,这是最简单的方法。
答案 4 :(得分:1)
myList=[1,7,9,3,1,2,8]
counts = {elem:myList.count(elem) for elem in set(myList)}
for i in counts:
if counts[i] > 1:
print '{} occurs more than once'.format(i)
如果您不想使用词典理解:
myList=[1,7,9,3,1,2,8]
counts = {}
for elem in set(myList):
counts[elem] = myList.count(elem)
if counts[elem] > 1:
print '{} occurs more than once'.format(i)
答案 5 :(得分:1)
可能不是最容易理解的,但这就是我的做法。
seen = set()
duplicated = [t for t in my_list if t in seen or seen.add(t)]
它等同于(并且更容易理解)
duplicated = []
seen = set()
for elem in my_list:
if elem in seen:
duplicated.append(elem)
else:
seen.add(elem)