Заменить дубликаты в столбце списка - PullRequest
0 голосов
/ 12 января 2019

Я получил список, в одном (последнем) столбце есть строка разделенных запятыми элементов:

temp = ['AAA', 'BBB', 'CCC-DDD', 'EE,FFF,FFF,EE']

Теперь я хочу удалить дубликаты в этом столбце.

Я пытался составить список из каждого столбца:

    e = [s.split(',') for s in temp]
    print e

Что дало мне:

[['AAA'], ['BBB'], ['CCC-DDD'], ['EE', 'FFF', 'FFF', 'EE']]

Теперь я попытался удалить дубликаты с помощью:

    y = list(set(e))
    print y

Что закончилось ошибкой

TypeError: unhashable type: 'list'

Буду признателен за любую помощь.

Редактировать

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

temp = ['AAA', 'BBB', 'CCC-DDD', 'EE', 'FFF']

Только последние дубликаты должны быть удалены в последнем столбце.

Ответы [ 4 ]

0 голосов
/ 12 января 2019

Вот простой функциональный способ сделать это в Python:

from functools import partial

split = partial(str.split, sep=',')

list(map(list, map(set, (map(split, temp)))))
[['AAA'], ['BBB'], ['CCC-DDD'], ['EE', 'FFF']]

Или, как я вижу, ответу не нужны списки внутри списка:

from itertools import chain

list(chain(*map(set, (map(split, temp)))))
['AAA', 'BBB', 'CCC-DDD', 'EE', 'FFF']
0 голосов
/ 12 января 2019

Вот решение, которое использует itertools.chain метод

import itertools

temp = ['AAA', 'BBB', 'CCC-DDD', 'EE,FFF,FFF,EE']
y = list(set(itertools.chain(*[s.split(',') for s in temp])))
# ['EE', 'FFF', 'AAA', 'BBB', 'CCC-DDD']
0 голосов
/ 12 января 2019
 a = ['AAA', 'BBB', 'CCC-DDD', 'EE,FFF,FFF,EE']
 b = [s.split(',') for s in a]
 c = []
 for i in b:
     c = c + i
 c = list(set(c))

 ['EE', 'FFF', 'AAA', 'BBB', 'CCC-DDD']
0 голосов
/ 12 января 2019

Применить set к элементам списка, отсутствующего в списке списков. Вы хотите, чтобы ваш set содержал строки каждого списка, а не списки.

e = [list(set(x)) for x in e]

Вы также можете сделать это напрямую:

e = [list(set(s.split(','))) for s in temp]

>>> e
[['AAA'], ['BBB'], ['CCC-DDD'], ['EE', 'FFF']]

вместо этого вы можете захотеть sorted(set(s.split(','))), чтобы обеспечить лексикографический порядок (наборы не упорядочены, даже в Python 3.7 )

для плоского упорядоченного списка, создайте понимание плоского набора и отсортируйте его:

e = sorted({x for s in temp for x in s.split(',')})

результат:

['AAA', 'BBB', 'CCC-DDD', 'EE', 'FFF']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...