Добавление значения в список без дубликатов - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть список целых чисел, содержащий:

intlist = [19,4,2,4]

и я хочу добавить значение из списка intlist в список списка, такой что:

noDuplist = [[19,0],[4,1],[2,2]]

, где первый индекс представляет значение из списка intlist, а второй индекс представляет индекс значения в списке intlist. 19 - индекс 0, 4 - индекс 1, 2 - индекс 2. Поскольку есть еще 4, я не хочу их включать, поскольку я не хочу дублировать, поэтому последние 4 просто будут опущены.

Я пробовал что-то вроде:

noDuplist = []
for i in range(len(intlist)):
    if intlist[i] not in noDuplist:
        noDuplist.append([intlist[i],i])

но я все еще получаю

[[19, 0], [4, 1], [2, 2], [4, 3]]

там, где [4,3] не должно быть. Буду признателен за помощь в этом

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Полагаю, вы хотите сохранить индексы из исходной последовательности. Таким образом, то, что вы хотите, это то, что помнит, по какому индексу было значение впервые увиденный в оригинальной последовательности.

Проблема в вашем состоянии с

if intlist[i] not in noDuplist:
   # something

проверит, присутствует ли 4 в [[19, 0], [4, 1], [2, 2]]], а это не так.

Более чистый способ сделать это - использовать словари или наборы .:

intlist = [19,4,2,4]
seen_so_far, noDuplist = set(), []

for i, v in enumerate(intlist):
    if v not in seen_so_far:
        noDuplist.append([v, i])
        seen_so_far.add(v)

print(noDuplist)

Что дает на выходе [[19, 0], [4, 1], [2, 2]]

0 голосов
/ 08 сентября 2018

Первое, что я бы предложил, это не беспокоиться о сохранении как индекса, так и значения. Вы все равно узнаете индекс при извлечении элементов.

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

Это приведет к сложности O (N).

Редактировать : Я недостаточно внимательно прочитал ваше описание. Поскольку вам нужен индекс из исходного массива, просто введите оба в качестве пары ключ / значение в свой словарь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...