我正在尝试检查 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]
我正在尝试检查 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]
您尝试做的事情几乎肯定可以通过一组来实现。
>>> 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]
不使用 set 的更 Pythonic 方式如下:
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:
...
你的第一个条件总是会通过,因为它会寻找一个整数348521
,list
其中索引处有一个元素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:
...
我同意其他答案,即您在这里做一些奇怪的事情。您有一个列表,其中包含一个包含多个条目的字符串,这些条目本身就是您要与整数 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
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]
我们将其分配给变量numbers
我相信,这将适用于列表中的所有类型的数据,如果操作正确,也适用于对象。
您的列表只包含一个字符串。将其转换为整数 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']
如果你真的不想改变你的结构,或者至少创建一个包含相同数据的副本(例如,使用 setter 和 getter 创建一个类属性,在后台读取/写入该字符串),那么你可以使用正则表达式在任何给定时间检查项目是否在该“列表”中,如果没有,则将其作为单独的元素附加到“列表”中。
if not re.match("\b{}\b".format(348521), some_list[0]): some_list.append(348521)
这可能比每次您想检查项目是否在其中时将其转换为集合要快。但是set
像其他人在这里建议的那样使用会好一百万倍。
您的 id 变量是一个数字,其中您的列表只有一个元素。这是一个包含您的其他 ID 的字符串。您要么需要检查 id 是否在该字符串中,要么从字符串中提取数字并将它们分别存储在列表中
list = [350882, 348521, 350166]