можно пересчитать вхождения в список понимания, превращая их в tuple
, так что вы можете хэширования & применять единственность:
routes = [[1, 2, 4, 6, 10], [1, 3, 8, 9, 10], [1, 2, 4, 6, 10]]
dups = set(tuple(x) for x in routes if routes.count(x)>1)
print(dups)
результат:
{(1, 2, 4, 6, 10)}
Простой, но много циклов под капотом из-за повторных звонков на номер count
. Там еще один способ, который включает в себя хэширование, но имеет меньшую сложность будет использовать collections.Counter
:
from collections import Counter
routes = [[1, 2, 4, 6, 10], [1, 3, 8, 9, 10], [1, 2, 4, 6, 10]]
c = Counter(map(tuple,routes))
dups = [k for k,v in c.items() if v>1]
print(dups)
Результат:
[(1, 2, 4, 6, 10)]
(Посчитайте Кортеж преобразованных подсписков - фиксируя вопрос хеширования - и сгенерируйте список дубликатов, используя список, сохраняя только элементы, которые появляются более одного раза)
Теперь, если вы просто хотите обнаружить, что есть несколько дубликатов списков (без их печати), вы могли бы
- преобразовать список списков в список кортежей, так что вы можете хэш их в наборе
- сравнить длину списка против длины набора:
Len отличается, если некоторые дубликаты:
routes_tuple = [tuple(x) for x in routes]
print(len(routes_tuple)!=len(set(routes_tuple)))
или, будучи в состоянии использовать map
в Python 3 достаточно редко, чтобы быть так упоминалось:
print(len(set(map(tuple,routes))) != len(routes))
nitpick: удалить '[]' из '' '' '' '' ', чтобы использовать более быстрое выражение генератора – Harvey
определенно не nitpick !! Я так привык к «.» .Join ([]) 'to_speed up_' join' ... –
@Donald: также, если желание состоит только в удалении дубликатов, тогда просто: 'set (tuple (x) для x в маршрутах) ' – Harvey