我正在尝试检查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]
Run Code Online (Sandbox Code Playgroud)
Joh*_*ohn 68
你几乎肯定可以用一套来实现你想要做的事情.
>>> 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])
>>>
Run Code Online (Sandbox Code Playgroud)
使用set的add方法,您可以非常快速地构建一组唯一的ID.或者,如果您已经有一个列表
unique_ids = set(id_list)
Run Code Online (Sandbox Code Playgroud)
至于以数字形式获取输入,你可以做类似的事情
>>> ids = [int(n) for n in '350882 348521 350166\r\n'.split()]
>>> ids
[350882, 348521, 350166]
Run Code Online (Sandbox Code Playgroud)
Ati*_*ska 33
一种更pythonic的方式,不使用set如下:
lst = [1, 2, 3, 4]
lst.append(3) if 3 not in lst else lst
Run Code Online (Sandbox Code Playgroud)
7 年后,请允许我在之前的答案的基础上给出一个简单的解决方案。你可以执行以下操作:
numbers = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
要添加[3, 4, 5]到numbers而不重复3,请执行以下操作:
numbers = list(set(numbers + [3, 4, 5]))
Run Code Online (Sandbox Code Playgroud)
这会导致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进行比较.
这几乎肯定不是你应该做的.在存储到列表中之前,您可能应该接受输入并将其转换为整数.你可以这样做:
input = '350882 348521 350166\r\n'
list.append([int(x) for x in input.split()])
Run Code Online (Sandbox Code Playgroud)
然后你的测试将通过.如果你真的确定你不想做你现在正在做的事情,那么下面应该做你想要的,即不添加已经存在的新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
Run Code Online (Sandbox Code Playgroud)
你的例子有几件事情正在发生。您有一个包含一串数字和换行符的列表:
list = ['350882 348521 350166\r\n']
Run Code Online (Sandbox Code Playgroud)
并且您正在尝试在此列表中查找数字 ID:
id = 348521
if id not in list:
...
Run Code Online (Sandbox Code Playgroud)
你的第一个条件总是会通过,因为它会寻找整数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'
... # ^^^^^^
Run Code Online (Sandbox Code Playgroud)
但是请注意,您需要str(id)使用空格进行搜索,否则它也会匹配:
2348521999
^^^^^^
Run Code Online (Sandbox Code Playgroud)
目前尚不清楚您是否希望您的“列表”是“由空格分隔的整数字符串”,或者您是否真的想要一个整数列表。
如果您想要完成的只是拥有一个 ID 列表,并且仅当 ID 尚未包含时才将它们添加到该列表中(并且如果列表中元素的顺序不重要),那么集合将是最好的数据结构。
2348521999
^^^^^^
Run Code Online (Sandbox Code Playgroud)
如果字符串中 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
101904 次 |
| 最近记录: |