Подтвердить что ты не робот

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

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

   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]
4b9b3361

Ответ 1

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

>>> 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 вы можете быстро создать свой уникальный набор идентификаторов. Или, если у вас уже есть список

unique_ids = set(id_list)

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

>>> ids = [int(n) for n in '350882 348521 350166\r\n'.split()]
>>> ids
[350882, 348521, 350166]

Ответ 2

Я согласен с другими ответами, что вы делаете что-то странное здесь. У вас есть список, содержащий строку с несколькими записями, которые сами являются целыми числами, которые вы сравниваете с целым 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

Ответ 3

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

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

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

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

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

Ответ 5

Более питонический способ без использования set выглядит следующим образом:

lst = [1, 2, 3, 4]
lst.append(3) if 3 not in lst else lst

Ответ 6

С вашим примером происходит пара вещей. У вас есть список, содержащий строку цифр и символов новой строки:

list = ['350882 348521 350166\r\n']

И вы пытаетесь найти номер ID в этом списке:

id = 348521
if id not in list:
    ...

Ваше первое условие всегда будет проходить, потому что оно будет искать целое число 348521 в list который имеет один элемент в list[0] индексов list[0] со строковым значением '350882 348521 350166\r\n', поэтому будет добавлено целое число 348521 к этому списку, делая его списком из двух элементов: строки и целого числа, как показывает ваш вывод.

Повторим: в списке ищется идентификатор, а не строка в первом элементе списка.

Если вы пытаетесь найти, содержалось ли строковое представление '348521' в большей строке, содержащейся в вашем списке, вы могли бы сделать следующее, отметив, что вам нужно будет сделать это для каждого элемента в list:

if str(id) not in list[0]: # list[0]: '350882 348521 350166\r\n'
    ...                    #                  ^^^^^^

Однако учтите, что вам нужно будет обернуть str(id) пробелами для поиска, иначе он также будет соответствовать:

2348521999
 ^^^^^^

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

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

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)

Если порядок идентификаторов в строке важен, я бы оставил ваши идентификаторы в стандартном списке и использовал бы вашу условную проверку:

ids = [int(id) for id in '350882 348521 350166\r\n'.strip().split(' ')]

if 348521 not in ids:
    ...

Ответ 7

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

list  = [350882, 348521, 350166]