Есть ли способ удалить повторяющиеся элементы списка, основанные на вложенных списках, независимо от порядка вложенных элементов списка? - PullRequest
0 голосов
/ 08 октября 2019

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

list = [
[['Milk', 'Bread', 'Diaper'], 40.0], 
[['Milk', 'Diaper', 'Bread'], 40.0], 
[['Milk', 'Diaper', 'Beer'], 40.0], 
[['Milk', 'Beer', 'Diaper'], 40.0], 
[['Diaper', 'Bread', 'Milk'], 40.0], 
[['Diaper', 'Bread', 'Beer'], 40.0], 
[['Diaper', 'Milk', 'Bread'], 40.0], 
[['Diaper', 'Milk', 'Beer'], 40.0], 
[['Diaper', 'Beer', 'Bread'], 40.0], 
[['Diaper', 'Beer', 'Milk'], 40.0], 
[['Beer', 'Bread', 'Diaper'], 40.0], 
[['Beer', 'Milk', 'Diaper'], 40.0], 
[['Beer', 'Diaper', 'Bread'], 40.0], 
[['Beer', 'Diaper', 'Milk'], 40.0]
]

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

Выходными данными должен быть один экземпляр каждой комбинации:

updated_list = [
[['Milk', 'Bread', 'Diaper'], 40.0],
[['Diaper', 'Beer', 'Bread'], 40.0], 
[['Beer', 'Diaper', 'Milk'], 40.0]
]

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Вы можете использовать Python set и frozenset для этого:

seen_it = set()
updated_list = []
for line in list:
    key = frozenset(line[0])
    if key not in seen_it:
        seen_it.add(key)
        updated_list.append(line)

Обратите внимание, что seen_it отслеживает, какие списки мы видели ранее, чтобы избежать добавления в уникальные строки в updated_list.

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

0 голосов
/ 08 октября 2019

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

Набор представляет собой неупорядоченную коллекциюуникальные элементы, поэтому {1, 2, 3} эквивалентно {3, 2, 1}. Если вы передадите список в set, он создаст набор с элементами списка. Однако, если одно и то же значение было в списке дважды, эта информация теряется в наборе.

# These are both the set {1, 2, 3}
s1 = {3, 1, 2, 1}
s2 = set([2, 1, 3, 3, 2])
assert s1 == s2 # True

Если в списках могут быть дубликаты, вам необходим тип данных мультимножество. К сожалению, Python не предоставляет мультимножество. Однако Counter подходит для многих случаев использования мультимножества, включая сравнение.

from collections import Counter
# These counters have different numbers of each value
c1 = Counter(['a', 'b', 'a', 'c'])
c2 = Counter(['c', 'b', 'b', 'a', 'c'])
assert c1 == c2 # False

Что касается фактического удаления дубликатов, рецепт Itertools unique_everseen должен удовлетворить ваши потребности. Если вам не нужны дубликаты в других элементах списка, вы можете использовать operator.itemgetter в качестве функции key.


Кроме того, вы не должны использовать "list "как имя переменной; плохо скрывать встроенных .

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