我正在尝试检查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]
答案 0 :(得分:54)
你想要做的事情几乎肯定可以通过一套来实现。
>>> 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]
答案 1 :(得分: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
答案 2 :(得分:3)
7 年后,请允许我在先前答案的基础上给出一个单一的解决方案。您可以执行以下操作:
numbers = [1, 2, 3]
要将 [3, 4, 5]
添加到 numbers
而不重复 3
,请执行以下操作:
numbers = list(set(numbers + [3, 4, 5]))
这导致 4
和 5
被添加到 numbers
,如 [1, 2, 3, 4, 5]
说明:
现在让我解释一下发生了什么,从 set()
指令的内部开始,我们取 numbers
并添加了 3
、4
和 5
它使 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]
,我们将它分配给变量 {{ 1}}
我相信,这将适用于列表中的所有类型的数据,如果操作正确,也适用于对象。
答案 3 :(得分: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']
答案 4 :(得分:0)
如果你真的不想改变你的结构,或者至少创建一个包含相同数据的副本(例如,使用setter和getter创建一个类属性,在后台读取/写入该字符串) ,然后你可以使用正则表达式检查一个项目是否在任何给定时间在该“列表”中,如果没有,则将其作为单独的元素附加到“列表”。
if not re.match("\b{}\b".format(348521), some_list[0]): some_list.append(348521)
每次要检查项目是否在其中时,这可能比将其转换为集合更快。但是使用set
和其他人一样,这里的建议要好一百万倍。
答案 5 :(得分:0)
不使用set的更Python方式如下:
lst = [1, 2, 3, 4]
lst.append(3) if 3 not in lst else lst
答案 6 :(得分:0)
您的示例发生了两件事。您有一个包含一串数字和换行符的列表:
list = ['350882 348521 350166\r\n']
您正在尝试在此列表中查找数字ID:
id = 348521
if id not in list:
...
您的第一个条件总是会通过,因为它将在348521
中寻找整数list
,该整数在索引list[0]
处有一个元素,其字符串值为{{1} },因此整数348521将被添加到该列表中,使其成为包含两个元素的列表:字符串和整数,如您的输出所示。
要重申:在列表中搜索ID,而不是列表的第一个元素中的字符串。
如果您要查找'350882 348521 350166\r\n'
的字符串表示形式是否包含在列表中包含的较大字符串中,则可以执行以下操作,请注意,您需要对{{ 1}}:
'348521'
但是请注意,您需要用空格将list
换行,否则它也将匹配:
if str(id) not in list[0]: # list[0]: '350882 348521 350166\r\n'
... # ^^^^^^
不清楚您是希望“列表”是“由空格分隔的整数字符串”,还是真的要整数列表。
如果您要完成的全部工作就是拥有一个ID列表,并且仅在ID不包含ID的情况下(并且如果列表中元素的顺序为 不重要 ,那么集合将是使用的最佳数据结构。
str(id)
如果ID在字符串 中的顺序很重要,那么我会将您的ID保留在标准列表中,并使用条件检查:
2348521999
^^^^^^
答案 7 :(得分:-1)
您的id变量是一个数字,其中您的列表只有一个元素。它是一个包含其他ID的字符串。你需要检查id是否在该字符串中,或者从字符串中提取数字并将它们分别存储在列表中
list = [350882, 348521, 350166]