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

19

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

   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
источник
  • Ваш идентификатор является частью строки, поэтому значение добавляется. 348521 не соответствует этой строке. –  Rohit Jain 28.06.2013 в 20:05
  • Почему это странное содержимое списка? a) они являются строками, б) в одном элементе, похоже, много идентификаторов. Я бы посоветовал сначала канонизировать структуру данных. –  Nils Werner 28.06.2013 в 20:06
  • @NilsWerner - как проверить, присутствует ли идентификатор в одном элементе, который содержит несколько идентификаторов –  user2341103 28.06.2013 в 20:10
  • Сначала измените структуру данных. –  Nils Werner 28.06.2013 в 20:12
  • Как предупреждение - оба идентификатора и списка уже используются стандартной библиотекой. Если вы перепишете их, у вас будет плохое время. –  viraptor 28.06.2013 в 20:14
Показать остальные комментарии

5 ответов

40

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

>>> 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
источник
  • Но набор неупорядочен. Если OP хочет сохранить первоначальный порядок списка, это не сработает. –  LWZ 29.08.2017 в 21:45
  • Вы правы, если какие-либо будущие посетители должны поддерживать порядок, они могут рассмотреть некоторую реализацию упорядоченного набора. –  John 29.08.2017 в 22:38
  • первоначальный заказ будет утерян в случае, если что-то подобное выполняется с помощью набора. –  Divij Sehgal 21.03.2018 в 07:49
7

Я согласен с другими ответами, что вы делаете что-то странное здесь. У вас есть список, содержащий строку с несколькими записями, которые сами являются целыми числами, которые вы сравниваете с целым 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
источник
  • является «int (y) для x в списке для y в x.split ()» действительным? –  user2341103 28.06.2013 в 20:31
  • @user - да, это должно быть действительно. Это выглядит странно, я знаю. Петли «for» следует читать в том порядке, в котором они написаны. Затем вы берете все, что есть перед циклом for. –  JoshG79 28.06.2013 в 20:34
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
источник
  • Я хочу сохранить их как строки –  user2341103 28.06.2013 в 20:24
  • Обновите свой вопрос с помощью желаемого результата. Мы не читатели! –  Mark Tolonen 29.06.2013 в 01:22
  • @ user2341103, Похоже, вы читаете значения из файла. Просто напишите его обратно, присоединившись обратно к строкам. Обновленный ответ с примером. –  Mark Tolonen 29.06.2013 в 01:35
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
источник