Удаляет дубликаты из вложенного списка без использования набора - PullRequest
1 голос
/ 03 августа 2020

У меня есть список списков, и я хочу удалить дубликаты в каждом вложенном списке.

Input: [['c', 'p', 'p'], ['a', 'a', 'a'], ['t', 't', 'p']]
Output: [['c', 'p'], ['a'], ['t','p']]

Ключевым моментом здесь является то, что я не могу использовать функцию set () или fromkeys ().

Вот код, который у меня есть,

ans = []

for i in letters:
    [ans.append([x]) for x in i if x not in ans]

, который возвращает

[['c'], ['p'], ['p'], ['a'], ['a'], ['a'], ['t'], ['t'], ['p']]

, чего я не хочу.

Ответы [ 5 ]

1 голос
/ 03 августа 2020

Вы запутались с вложенными списками. Второй l oop необходим для фильтрации элементов. Хотя это довольно неэффективно, вы можете записать свою попытку как

ans = []
for i in letters:
    k = []
    for j in i:
        if j not in k:
            k.append(j)
    ans.append(k)

Вероятно, вы можете сократить этот код, но не уменьшить его сложность.

Для этого вы можете использовать что-то sorted и itertools.groupby. это по-прежнему менее эффективно, чем таблица ha sh, но лучше, чем линейный поиск (хотя, вероятно, это не имеет большого значения для коротких массивов):

ans = [[k for k, _ in groupby(sorted(i))] for i in letters]
0 голосов
/ 03 августа 2020

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

  • для каждого подсписка ввода: [[...] for sub in input]
  • сохранить букву, если ее нет в остальной части подсписка: [ltr for i, ltr in enumerate(sub) if ltr not in sub[i+1:]]

Сложите все вместе, и вы получите:

input  = [['c', 'p', 'p'], ['a', 'a', 'a'], ['t', 't', 'p']]
output = [[ltr for i, ltr in enumerate(sub) if ltr not in sub[i+1:]] for sub in input]
print(output) #[['c', 'p'], ['a'], ['t', 'p']]
0 голосов
/ 03 августа 2020

Поскольку вы не можете использовать set() или fromkeys(), я бы предложил обычную итерацию l oop, каждый раз проверяя, присутствует ли уже значение:

lst = [['c', 'p', 'p'], ['a', 'a', 'a'], ['t', 't', 'p']]

new_lst = []
for x in lst:
    res = []
    for y in x:
        if y not in res:
            res.append(y)           
    new_lst.append(res)
    
print(new_lst)

В идеале new_lst здесь должен быть набор.

0 голосов
/ 03 августа 2020
list=[['c', 'p', 'p'], ['a', 'a', 'a'], ['t', 't', 'p']]
ans=[]
for sublist in list:
    temp=[]
    for ch in sublist:
        if ch not in temp:
            temp.append(ch)
    ans.append(temp)
print(ans)

# Думаю, должно работать, очень просто, можно было бы посложнее

0 голосов
/ 03 августа 2020

Вы можете перебирать внутренний список и проверять, присутствует ли этот символ уже или нет

inputList = [['c', 'p', 'p'], ['a', 'a', 'a'], ['t', 't', 'p']]
result = []

for l in inputList:
    # create a empty list to store intermediate result 
    tmp = []
    # iterate over sublist
    for ch in l:
        if ch not in tmp: tmp.append(ch)
    result.append(tmp)
print(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...