70

我正在尝试检查 id 是否在列表中,并且仅当它不在列表中时才附加 id提供关于这里有什么问题的意见?

   list = ['350882 348521 350166\r\n']
    id = 348521
    if id not in list:
        list.append(id)
    print list

OUTPUT:-
['350882 348521 350166\r\n', 348521]
4

8 回答 8

102

您尝试做的事情几乎肯定可以通过一组来实现。

>>> x = set([1,2,3])
>>> x.add(2)
>>> x
set([1, 2, 3])
>>> x.add(4)
>>> x.add(4)
>>> x
set([1, 2, 3, 4])
>>> 

使用 set 的 add 方法,您可以非常快速地构建您唯一的 id 集。或者如果你已经有一个列表

unique_ids = set(id_list)

至于以数字形式获取输入,您可以执行类似的操作

>>> ids = [int(n) for n in '350882 348521 350166\r\n'.split()]
>>> ids
[350882, 348521, 350166]
于 2013-06-28T18:11:45.637 回答
35

不使用 set 的更 Pythonic 方式如下:

lst = [1, 2, 3, 4]
lst.append(3) if 3 not in lst else lst
于 2019-03-20T05:34:36.147 回答
8

您的示例发生了一些事情。您有一个包含一串数字和换行符的列表:

list = ['350882 348521 350166\r\n']

您正在尝试在此列表中查找号码 ID:

id = 348521
if id not in list:
    ...

你的第一个条件总是会通过,因为它会寻找一个整数348521list其中索引处有一个元素list[0]的字符串值为'350882 348521 350166\r\n',因此整数 348521 将被添加到该列表中,使其成为两个元素的列表:一个字符串和一个整数,如您的输出所示。

重申一下:在列表中搜索 id,而不是列表第一个元素中的字符串。

如果您试图查找 的字符串表示'348521'是否包含在列表中包含的较大字符串中,您可以执行以下操作,注意您需要对 中的每个元素执行此操作list

if str(id) not in list[0]: # list[0]: '350882 348521 350166\r\n'
    ...                    #                  ^^^^^^

但是请注意,您需要str(id)使用空格进行搜索,否则它也会匹配:

2348521999
 ^^^^^^

目前尚不清楚您是否希望“列表”成为“由空格分隔的整数字符串”,或者您是否真的想要整数列表。

如果您想要完成的只是拥有一个 ID 列表,并且只有在它们尚未包含的情况下才将 ID 添加到该列表中(并且如果列表中元素的顺序不重要),那么一个集合将成为最好的数据结构。

ids = set(
    [int(id) for id in '350882 348521 350166\r\n'.strip().split(' ')]
)

# Adding an ID already in the set has no effect
ids.add(348521)

如果字符串中 ID 的顺序很重要,那么我会将您的 ID 保存在标准列表中并使用您的条件检查:

ids = [int(id) for id in '350882 348521 350166\r\n'.strip().split(' ')]

if 348521 not in ids:
    ...
于 2019-05-09T05:39:42.777 回答
7

我同意其他答案,即您在这里做一些奇怪的事情。您有一个列表,其中包含一个包含多个条目的字符串,这些条目本身就是您要与整数 id 进行比较的整数。

这几乎肯定不是你应该做的。在存储到列表之前,您可能应该接受输入并将其转换为整数。你可以这样做:

input = '350882 348521 350166\r\n'
list.append([int(x) for x in input.split()])

那么你的测试就会通过。如果你真的确定你不想做你目前正在做的事情,下面应该做你想做的事情,即不添加已经存在的新 id:

list = ['350882 348521 350166\r\n']
id = 348521
if id not in [int(y) for x in list for y in x.split()]:
    list.append(id)
print list
于 2013-06-28T18:19:39.370 回答
4

7 年后,请允许我在以前的答案的基础上给出一个单一的解决方案。您可以执行以下操作:

numbers = [1, 2, 3]

要添加而不重复,请执行[3, 4, 5]以下操作:numbers3

numbers = list(set(numbers + [3, 4, 5]))

这导致4并被5添加numbers[1, 2, 3, 4, 5]

说明

现在让我解释一下发生了什么,从set()指令的内部开始,我们numbers添加了3,45, 使其numbers看起来像[1, 2, 3, 3, 4, 5]. 然后,我们把那个 ( [1, 2, 3, 3, 4, 5]) 转换成一个去除重复的集合,得到下面的{1, 2, 3, 4, 5}. 现在因为我们想要一个列表而不是一个集合,我们使用该函数list()将该集合 ( {1, 2, 3, 4, 5}) 变成一个列表,从而[1, 2, 3, 4, 5]我们将其分配给变量numbers

我相信,这将适用于列表中的所有类型的数据,如果操作正确,也适用于对象。

于 2020-12-31T11:07:40.740 回答
2

您的列表只包含一个字符串。将其转换为整数 ID:

L = ['350882 348521 350166\r\n']

ids = [int(i) for i in L[0].strip().split()]
print(ids)
id = 348521
if id not in ids:
    ids.append(id)
print(ids)
id = 348522
if id not in ids:
    ids.append(id)
print(ids)
# Turn it back into your odd format
L = [' '.join(str(id) for id in ids) + '\r\n']
print(L)

输出:

[350882, 348521, 350166]
[350882, 348521, 350166]
[350882, 348521, 350166, 348522]
['350882 348521 350166 348522\r\n']
于 2013-06-28T18:17:03.690 回答
0

如果你真的不想改变你的结构,或者至少创建一个包含相同数据的副本(例如,使用 setter 和 getter 创建一个类属性,在后台读取/写入该字符串),那么你可以使用正则表达式在任何给定时间检查项目是否在该“列表”中,如果没有,则将其作为单独的元素附加到“列表”中。

if not re.match("\b{}\b".format(348521), some_list[0]): some_list.append(348521)

这可能比每次您想检查项目是否在其中时将其转换为集合要快。但是set像其他人在这里建议的那样使用会好一百万倍。

于 2013-06-28T18:21:17.957 回答
-2

您的 id 变量是一个数字,其中您的列表只有一个元素。这是一个包含您的其他 ID 的字符串。您要么需要检查 id 是否在该字符串中,要么从字符串中提取数字并将它们分别存储在列表中

list  = [350882, 348521, 350166]
于 2013-06-28T18:13:56.163 回答