在Python中检查一个数字是否已经存在于列表中

41

我正在编写一个Python程序,其中我将把数字附加到列表中,但我不希望列表中的数字重复。那么,在执行list.append()之前,如何检查数字是否已经在列表中?


1
为什么不直接使用 set 呢? - loganfsmyth
5个回答

84

你可以做

if item not in mylist:
     mylist.append(item)

但你应该真正使用一个集合,就像这样:

myset = set()
myset.add(item)

编辑:如果顺序很重要但列表非常大,您应该同时使用列表集合,像这样:

mylist = []
myset = set()
for item in ...:
    if item not in myset:
        mylist.append(item)
        myset.add(item)

这样做可以快速查找元素是否存在,同时保持列表的顺序。如果使用朴素解决方案,则查找的性能为O(n),如果列表很大,则可能会变得很糟糕。

或者,正如@larsman指出的那样,您可以使用OrderedDict来达到相同的效果:

from collections import OrderedDict

mydict = OrderedDict()
for item in ...:
    mydict[item] = True

1
set 没有 append 方法。你肯定是想用 add - Rohit Jain
1
再次强调,集合是无序的,因此它们并不等同。 - Gareth Latty
5
在Python >=2.7中,将True作为值的OrderedDict也可以使用。 - Fred Foo
@larsmans 没错,我实际上更喜欢使用集合解决方案,因为使用值为True的字典让我想起了JavaScript,但无论如何还是将其添加到答案中 :) - raph.amiard
我理解你的观点,但 OrderedDict 的主要优点在于你只需要一个容器对象,而不必定义一个新类。 - Fred Foo

8
如果您想在列表中拥有唯一元素,为什么不使用一个集合呢?当然,如果顺序对你不重要的话:-
>>> s = set()
>>> s.add(2)
>>> s.add(4)
>>> s.add(5)
>>> s.add(2)
>>> s
39: set([2, 4, 5])

如果订单是一个关注的问题,那么您可以使用以下方式:-
>>> def addUnique(l, num):
...     if num not in l:
...         l.append(num)
...     
...     return l

您还可以找到一个OrderedSet配方,这在Python文档中被提到。


所以如果我想要数字按升序排列,我必须这样做吗?你能再解释一下这部分吗?(是的,我必须有一个有序集合) - PhoonOne
@Jenny.. 这段代码并没有实际操作,只是通过使用 not in 操作符来检查元素 num 是否已经存在于列表 l 中,如果不存在,则将其添加到列表中,最后返回该列表。 - Rohit Jain

2
如果您希望将数字按升序排列,可以将它们添加到一个集合中,然后将集合排序为升序列表。
s = set()
if number1 not in s:
  s.add(number1)
if number2 not in s:
  s.add(number2)
...
s = sorted(s)  #Now a list in ascending order

1
您可以使用一个集合对象来代替。只需将数字添加到集合中即可。它们本身不会复制。

0

要检查一个数字是否在列表中,可以使用in关键字。

让我们创建一个列表

exampleList = [1, 2, 3, 4, 5]

现在让我们看一下它是否包含数字4:
contains = 4 in exampleList

print(contains)
>>>> True

由于您想在列表中没有元素时进行追加,因此 not in 也可以帮助实现。

exampleList2 = ["a", "b", "c", "d", "e"]

notcontain = "e" not in exampleList2

print(notcontain)
>>> False

但是,正如其他人所提到的,您可能需要考虑使用不同的数据结构,更具体地说,set。请参见以下示例(来源):

basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket)                      # show that duplicates have been removed
{'orange', 'banana', 'pear', 'apple'}

'orange' in basket                 # fast membership testing
True

'crabgrass' in basket
False

# Demonstrate set operations on unique letters from two words
...
a = set('abracadabra')
b = set('alacazam')
a                                  # unique letters in a
>>> {'a', 'r', 'b', 'c', 'd'}

a - b                              # letters in a but not in b
>>> {'r', 'd', 'b'}

a | b                              # letters in a or b or both
>>> {'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}

a & b                              # letters in both a and b
>>> {'a', 'c'}

a ^ b                              # letters in a or b but not both
>>> {'r', 'd', 'b', 'm', 'z', 'l'}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接