将 id 追加到列表(如果尚未在字符串中显示)

我试图检查 id 是否在一个列表中,并且使用下面的代码仅当 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]
238310 次浏览

几乎可以肯定,你正在尝试做的事情可以通过一个集合来实现。

>>> 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]

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

list  = [350882, 348521, 350166]

您的列表只包含一个字符串。将其转换为整数 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']

我同意其他答案,你在这里做一些奇怪的事情。您有一个包含有多个条目的字符串的列表,这些条目本身就是要与整数 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

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

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

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

不使用 set 的一种更简洁的方法如下:

lst = [1, 2, 3, 4]
lst.append(3) if 3 not in lst else lst

你的例子中有一些问题。您有一个包含数字字符串和换行符的列表:

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

您正试图在这个列表中找到一个编号 ID:

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

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

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

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

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

但是请注意,在搜索时需要用空格包装 str(id),否则它也会匹配:

2348521999
^^^^^^

目前还不清楚您是希望您的“列表”是一个“由空格分隔的整数字符串”,还是真正希望一个整数列表。

如果您试图完成的全部工作是拥有一个 ID 列表,并且只有在 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:
...

7年后,请允许我在前一个答案的基础上给出一个一行程序解决方案。你可以这样做:

numbers = [1, 2, 3]

要在不重复 3的情况下将 [3, 4, 5]加入到 numbers中,请执行以下操作:

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

这导致 45被添加到 numbers,就像在 [1, 2, 3, 4, 5]中一样

解说 :

现在让我解释一下发生了什么,从 set()指令的内部开始,我们将 numbers加入到 345中,使得 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

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