Если у меня есть дубликаты в списке в скобках, что мне делать - PullRequest
0 голосов
/ 27 августа 2018

Предположим, у меня есть следующий список:

 m=[1,2,[1],1,2,[1]]

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

 m=list(set(m))

, но когда я это делаю, я получаю сообщение об ошибке:

не подлежащий чтению тип 'set'.

Какая команда поможет мне удалить дубликаты, чтобы я мог остаться только со списком

 m=[1,2,[1]]

Спасибо

Ответы [ 4 ]

0 голосов
/ 27 августа 2018

Для более общего решения вы можете сериализовать каждый элемент списка с помощью pickle.dumps перед передачей их на set(), а затем десериализовать элементы с помощью pickle.loads:

import pickle
m = list(map(pickle.loads, set(map(pickle.dumps, m))))

Если вы хотитеисходный порядок, который нужно сохранить, вы можете использовать dict (который стал упорядоченным с Python 3.6+) вместо набора:

import pickle
m = list(map(pickle.loads, {k: 1 for k in map(pickle.dumps, m)}))

или если вам нужно быть совместимым с Python 3.5 или более ранними версиями,Вы можете использовать collections.OrderedDict вместо:

import pickle
from collections import OrderedDict
m = list(map(pickle.loads, OrderedDict((k, 1) for k in map(pickle.dumps, m))))
0 голосов
/ 27 августа 2018
result = []
for i in m:
  flag = True
  for j in m:
    if i == j:
      flag = False
  if flag:
    result.append(i)

Результат будет: [1,2,[1]]

Есть способы сделать этот код короче, но я пишу его более подробно для удобства чтения.Кроме того, обратите внимание, что этот метод O (n ^ 2), поэтому я не рекомендовал бы для длинных списков.Но выгода заключается в простоте.

0 голосов
/ 27 августа 2018

Первым шагом будет преобразование внутренних списков в кортежи:

>> new_list = [tuple(i) if type(i) == list else i for i in m]

Затем создайте набор для удаления дубликатов:

>> no_duplicates = set(new_list)
>> no_duplicates
{1, 2, (1,)}

, и вы можете преобразовать его в список, еслиВы хотите.

0 голосов
/ 27 августа 2018

Вы можете сделать что-то вроде этого:

m=[1,2,[1],1,2,[1]]
seen=set()
nm=[]
for e in m:
    try:
        x={e}
        x=e
    except TypeError:
        x=frozenset(e)  
    if x not in seen:
        seen.add(x) 
        nm.append(e)
>>> nm
[1, 2, [1]]

Из комментариев: Этот метод сохраняет порядок исходного списка.Если вы хотите, чтобы числовые типы были в порядке, а другие - вторыми, вы можете сделать:

sorted(nm, key=lambda e: 0 if isinstance(e, (int,float)) else 1)
...