检查python列表中是不是已经存在一个数字

Posted

技术标签:

【中文标题】检查python列表中是不是已经存在一个数字【英文标题】:check if a number already exist in a list in python检查python列表中是否已经存在一个数字 【发布时间】:2013-01-18 00:30:56 【问题描述】:

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

【问题讨论】:

为什么不直接使用set 【参考方案1】:

你可以的

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

【讨论】:

没有append for set 这样的方法。你肯定是指add 同样,集合是无序的,所以它不等价。 在 Python >=2.7 中,OrderedDictTrue 作为值也可以。 @larsmans 没错,我实际上更喜欢 set 解决方案,因为使用带有 True 作为值的 dicts 让我想起了 javascript,但无论如何都将它添加到答案中 :) 我明白你的意思,但OrderedDict 的主要好处是你只需要担心一个容器对象,而不必定义一个新类。【参考方案2】:

如果您想在列表中拥有独特的元素,那么为什么不使用集合,当然,如果顺序对您来说并不重要:-

>>> 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 Documentation 中有提及

【讨论】:

所以如果我想让数字升序,我必须这样做吗?你能再解释一下那部分吗? (是的,我必须有一个有序的集合) @Jenny.. 它什么也不做,只是检查元素 num 是否已经在列表 l 中,通过使用 not in 运算符,如果它不存在,它正在将其添加到列表中,然后最终返回列表。【参考方案3】:

如果您希望您的数字按升序排列,您可以将它们添加到一个集合中,然后将该集合排序到一个升序列表中。

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

【讨论】:

【参考方案4】:

您可能可以使用 set 对象来代替。只需add 号码即可。它们本质上不会复制。

【讨论】:

【参考方案5】:

要检查一个数字是否在列表中,可以使用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。请参阅以下示例 (Source):

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'

【讨论】:

以上是关于检查python列表中是不是已经存在一个数字的主要内容,如果未能解决你的问题,请参考以下文章

使用python查找列表中是不是存在项目的变量

如何编写一个函数来检查模块列表是不是存在,否则在 Python 中安装模块

如何检查一个数字是不是在列表列表中?

如何检查对象是不是已存在于列表中

如何检查列表中的项目是不是是python中任意数字的幂?

脚本编译后如何在python中重新加载模块?