Xác định nếu 2 danh sách có những yếu tố giống nhau, không phân biệt thứ tự?
Suy luận từ ví dụ của bạn:
x = ['a', 'b']
y = ['b', 'a']
rằng các phần tử của danh sách này sẽ không được lặp lại (họ là duy nhất) cũng như hashable (mà chuỗi và một số đối tượng python bất biến khác) , câu trả lời trực tiếp và hiệu quả nhất về tính toán sử dụng các bộ dựng sẵn của Python, (các ngữ nghĩa giống như các bộ toán học mà bạn có thể đã học được ở trường).
set(x) == set(y) # prefer this if elements are hashable
Trong trường hợp đó, yếu tố này là hashable, nhưng không duy nhất, các collections.Counter
cũng hoạt động ngữ nghĩa như một MultiSet, nhưng nó còn lâu mới chậm:
from collections import Counter
Counter(x) == Counter(y)
thích sử dụng sorted
:
sorted(x) == sorted(y)
nếu các phần tử có thể đặt hàng. Điều này sẽ giải thích cho các trường hợp không phải là duy nhất hoặc không có hàm băm, nhưng điều này có thể chậm hơn nhiều so với sử dụng tập hợp.
thực nghiệm Thử nghiệm
Một thí nghiệm thực nghiệm kết luận rằng người ta nên thích set
, sau đó sorted
. Chỉ chọn số Counter
nếu bạn cần những thứ khác như đếm hoặc sử dụng thêm dưới dạng nhiều lần.
thiết lập đầu tiên:
import timeit
import random
from collections import Counter
data = [str(random.randint(0, 100000)) for i in xrange(100)]
data2 = data[:] # copy the list into a new one
def sets_equal():
return set(data) == set(data2)
def counters_equal():
return Counter(data) == Counter(data2)
def sorted_lists_equal():
return sorted(data) == sorted(data2)
Và thử nghiệm:
>>> min(timeit.repeat(sets_equal))
13.976069927215576
>>> min(timeit.repeat(counters_equal))
73.17287588119507
>>> min(timeit.repeat(sorted_lists_equal))
36.177085876464844
Vì vậy, chúng ta thấy rằng so sánh bộ là giải pháp nhanh nhất, và đối chiếu danh mục được sắp xếp là nhanh thứ hai.
Không nên ngạc nhiên khi phương thức của bạn là O (N^2), lớn hơn nhiều so với O (N) hoặc O (N * log N). Đối với mọi phần tử của B (N phần tử), nó kiểm tra tất cả các phần tử của A (N phần tử). Số lần kiểm tra là N * N. – RobMcZag