如果尚未存在,则将id添加到列表中

时间:2013-06-28 18:04:01

标签: python

我正在尝试检查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]

8 个答案:

答案 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]))

这导致 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],我们将它分配给变量 {{ 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]