bạn có thể đếm số lần xuất hiện trong một sự hiểu biết danh sách, chuyển đổi chúng sang một tuple
để bạn có thể băm & áp dụng tính duy nhất:
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)
kết quả:
{(1, 2, 4, 6, 10)}
Đủ đơn giản, nhưng rất nhiều vòng lặp dưới mui xe do các cuộc gọi lặp lại đến count
. Có một cách khác, trong đó bao gồm băm nhưng có một độ phức tạp thấp hơn sẽ được sử dụng 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)
Kết quả:
[(1, 2, 4, 6, 10)]
(Chỉ cần đếm số các danh sách con tuple-chuyển đổi - sửa chữa các vấn đề băm -, và tạo danh sách dup bằng cách sử dụng danh sách hiểu, chỉ giữ các mục xuất hiện nhiều lần)
Bây giờ, nếu bạn muốn phát hiện có một số danh sách trùng lặp (không in), bạn có thể
- chuyển đổi các danh sách liệt kê một danh sách các hàng để bạn có thể băm chúng trong một tập
- so sánh độ dài của danh sách vs chiều dài của bộ:
len là khác nhau nếu có là một số bản sao:
routes_tuple = [tuple(x) for x in routes]
print(len(routes_tuple)!=len(set(routes_tuple)))
hay, có thể sử dụng map
bằng Python 3 là đủ hiếm để được mentionned vậy:
print(len(set(map(tuple,routes))) != len(routes))
nitpick: loại bỏ '[]' s từ bên trong 'set()' để sử dụng một biểu thức máy phát nhanh hơn – Harvey
chắc chắn không phải là một nitpick !! Tôi đã quen với '" ".join ([])' để _speed up_ 'join' ... –
@Donald: cũng vậy, nếu khao khát chỉ để loại bỏ các bản sao, thì đây chỉ là:' set (tuple (x)) cho x trong các tuyến đường) ' – Harvey