Добавление идентификатора в список, если он еще не присутствует

17

Я пытаюсь проверить, находится ли идентификатор в списке, и добавить его, только если его нет в списке, используя приведенный ниже код. Однако я вижу, что идентификатор добавляется, даже если идентификатор уже присутствует в списке. может ли кто-нибудь предоставить информацию о том, что здесь не так?

   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]
    
задан user2341103 28.06.2013 в 20:04
источник

5 ответов

34

То, что вы пытаетесь сделать, почти наверняка может быть достигнуто с помощью набора.

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

с помощью метода добавления набора вы можете быстро создать свой уникальный набор идентификаторов. Или, если у вас уже есть список

unique_ids = set(id_list)

, так как для ввода ваших входов в числовой форме вы можете сделать что-то вроде

>>> ids = [int(n) for n in '350882 348521 350166\r\n'.split()]
>>> ids
[350882, 348521, 350166]
    
ответ дан John 28.06.2013 в 20:11
источник
6

Я согласен с другими ответами, что вы делаете что-то странное здесь. У вас есть список, содержащий строку с несколькими записями, которые сами являются целыми числами, которые вы сравниваете с целым id.

Это почти наверняка не то, что вы должны делать. Вероятно, вы должны использовать ввод и преобразовать его в целые числа перед сохранением в своем списке. Вы можете сделать это с помощью:

input = '350882 348521 350166\r\n'
list.append([int(x) for x in input.split()])

Тогда ваш тест пройдет. Если вы действительно уверены, что не хотите делать то, что делаете сейчас, следующее должно делать то, что вы хотите, чтобы не добавлять новый идентификатор, который уже существует:

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
    
ответ дан JoshG79 28.06.2013 в 20:19
источник
2

Ваш список содержит только строку. Преобразуйте его в целые идентификаторы:

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']
    
ответ дан Mark Tolonen 28.06.2013 в 20:17
источник
0

Если вы действительно не хотите изменять свою структуру или, по крайней мере, создавать ее копию, содержащую те же данные (например, создать свойство класса с установщиком и получателем, которые читают / записывают в эту строку за кулисами) , тогда вы можете использовать регулярное выражение, чтобы проверить, находится ли элемент в этом «списке» в любой момент времени, а если нет, добавьте его в «список» в качестве отдельного элемента.

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

Это, вероятно, быстрее, чем преобразование его в набор каждый раз, когда вы хотите проверить, есть ли в нем элемент. Но использование set , как предложили другие, здесь в миллион раз лучше.

    
ответ дан dav 28.06.2013 в 20:21
источник
-1

Ваша переменная id - это номер, в котором ваш список содержит только один элемент. Это строка, содержащая другие идентификаторы. Вам нужно либо проверить, находится ли идентификатор в этой строке, либо вывести номера из строки и сохранить их в списке отдельно

list  = [350882, 348521, 350166]
    
ответ дан sedavidw 28.06.2013 в 20:13
источник