Hướng dẫn list that doesn t allow duplicates python - danh sách không cho phép trùng lặp python

Sử dụng set để theo dõi các mục đã thấy, các bộ cung cấp tra cứu O(1).

>>> item_list = [1, 7, 7, 7, 11, 14 ,100, 100, 4, 4, 4]
>>> seen = set()
>>> item_list[:] = [item for item in item_list
                                       if item not in seen and not seen.add(item)]
>>> item_list
[1, 7, 11, 14, 100, 4]

Nếu đơn hàng không quan trọng thì chỉ cần sử dụng set() trên item_list:

>>> set(item_list)
set([1, 100, 7, 11, 14, 4])

Phương pháp 3: Sử dụng Set ().

Phương pháp 4: Sử dụng danh sách hiểu + liệt kê ().

Trong câu trả lời này, sẽ có hai phần: hai giải pháp duy nhất và đồ thị tốc độ cho các giải pháp cụ thể.

collections.Counter là một công cụ mạnh mẽ trong thư viện tiêu chuẩn có thể hoàn hảo cho việc này. Chỉ có một giải pháp khác thậm chí còn có sự truy cập trong đó. Tuy nhiên, giải pháp đó cũng được giới hạn trong các khóa có thể băm.

Để cho phép các khóa không thể không thể truy cập được, tôi đã tạo một lớp container, sẽ cố gắng lấy hàm băm mặc định của đối tượng, nhưng nếu nó thất bại, nó sẽ thử chức năng nhận dạng của nó. Nó cũng định nghĩa một phương pháp EQ và một phương pháp băm. Điều này là đủ để cho phép các mặt hàng không thể không thể vượt qua trong giải pháp của chúng tôi. Các đối tượng không thể đo được sẽ được đối xử như thể chúng có thể băm. Tuy nhiên, hàm băm này sử dụng danh tính cho các đối tượng không thể không thể, có nghĩa là hai đối tượng bằng nhau đều không thể không hoạt động được. Tôi đề nghị bạn ghi đè lên điều này và thay đổi nó để sử dụng băm của một loại có thể thay đổi tương đương (như sử dụng hash(tuple(my_list)) nếu my_list là một danh sách).eq and a hash method. This should be enough to allow unhashable items in our solution. Unhashable objects will be treated as if they are hashable. However, this hash function uses identity for unhashable objects, meaning two equal objects that are both unhashable won't work. I suggest you override this, and changing it to use the hash of an equivalent mutable type (like using hash(tuple(my_list)) if my_list is a list).

Tôi cũng đã thực hiện hai giải pháp. Một giải pháp khác giữ thứ tự của các mục, sử dụng một lớp con của cả hai đơn đặt hàng và bộ đếm được đặt tên là 'đặt hàng'. Bây giờ, đây là các chức năng:

from collections import OrderedDict, Counter

class Container:
    def __init__(self, obj):
        self.obj = obj
    def __eq__(self, obj):
        return self.obj == obj
    def __hash__(self):
        try:
            return hash(self.obj)
        except:
            return id(self.obj)

class OrderedCounter(Counter, OrderedDict):
     'Counter that remembers the order elements are first encountered'

     def __repr__(self):
         return '%s(%r)' % (self.__class__.__name__, OrderedDict(self))

     def __reduce__(self):
         return self.__class__, (OrderedDict(self),)
    
def remd(sequence):
    cnt = Counter()
    for x in sequence:
        cnt[Container(x)] += 1
    return [item.obj for item in cnt]

def oremd(sequence):
    cnt = OrderedCounter()
    for x in sequence:
        cnt[Container(x)] += 1
    return [item.obj for item in cnt]

>>> set(item_list)
set([1, 100, 7, 11, 14, 4])
0 được sắp xếp không theo thứ tự, trong khi
>>> set(item_list)
set([1, 100, 7, 11, 14, 4])
1 được sắp xếp. Bạn có thể nói rõ cái nào nhanh hơn, nhưng tôi sẽ giải thích dù sao đi nữa. Việc sắp xếp không được đặt hàng nhanh hơn một chút, vì nó không lưu trữ thứ tự của các mục.

Bây giờ, tôi cũng muốn hiển thị các so sánh tốc độ của mỗi câu trả lời. Vì vậy, tôi sẽ làm điều đó ngay bây giờ.

Chức năng nào là nhanh nhất?

Để loại bỏ các bản sao, tôi đã thu thập 10 chức năng từ một vài câu trả lời. Tôi đã tính toán tốc độ của từng hàm và đặt nó vào một biểu đồ bằng cách sử dụng matplotlib.pyplot.

Tôi chia điều này thành ba vòng vẽ đồ thị. A Hashable là bất kỳ đối tượng nào có thể được băm, không thể không được là bất kỳ đối tượng nào không thể được băm. Một chuỗi được đặt hàng là một chuỗi bảo tồn thứ tự, một chuỗi không theo thứ tự không bảo tồn thứ tự. Bây giờ, đây là một vài điều khoản nữa:

Hashable không có thứ tự là cho bất kỳ phương pháp nào đã loại bỏ các bản sao, mà không nhất thiết phải giữ thứ tự. Nó không phải làm việc cho các thiết bị không có, nhưng nó có thể.

Hashable có thể đặt hàng là cho bất kỳ phương pháp nào giữ thứ tự của các mục trong danh sách, nhưng nó không phải làm việc cho các thiết bị không được miễn phí, nhưng nó có thể.

Đặt hàng không thể không được là bất kỳ phương pháp nào giữ thứ tự của các mục trong danh sách và làm việc cho các thiết bị không.

Trên trục y là số giây nó đã mất.

Trên trục x là số hàm được áp dụng.

Tôi đã tạo trình tự cho các băm chưa được đặt hàng và các băm được đặt hàng với độ hiểu sau:

>>> set(item_list)
set([1, 100, 7, 11, 14, 4])
2

Đối với các đơn đặt hàng không được đặt hàng:

>>> set(item_list)
set([1, 100, 7, 11, 14, 4])
3

Lưu ý có một

>>> set(item_list)
set([1, 100, 7, 11, 14, 4])
4 trong phạm vi vì không có nó, điều này sẽ mất 10 lần. Ngoài ra bởi vì theo ý kiến ​​cá nhân của tôi, tôi nghĩ rằng nó có thể dễ đọc hơn một chút.

Cũng lưu ý các khóa trên truyền thuyết là những gì tôi đã cố gắng đoán là phần quan trọng nhất của việc thực hiện chức năng. Đối với những chức năng tồi tệ nhất hay tốt nhất? Biểu đồ nói cho chính nó.

Với điều đó đã được giải quyết, đây là các biểu đồ.

Hashables không có thứ tự

Hướng dẫn list that doesn t allow duplicates python - danh sách không cho phép trùng lặp python
(Phóng to lên)
Hướng dẫn list that doesn t allow duplicates python - danh sách không cho phép trùng lặp python

Đặt hàng Hashables

Hướng dẫn list that doesn t allow duplicates python - danh sách không cho phép trùng lặp python
(Phóng to lên)
Hướng dẫn list that doesn t allow duplicates python - danh sách không cho phép trùng lặp python

Đặt hàng Hashables

Hướng dẫn list that doesn t allow duplicates python - danh sách không cho phép trùng lặp python
(Phóng to lên)
Hướng dẫn list that doesn t allow duplicates python - danh sách không cho phép trùng lặp python

Cái nào không cho phép trùng lặp trong Python?

Bộ không thể chứa các bản sao.Các bản sao bị loại bỏ khi khởi tạo một tập hợp.Nếu thêm một phần tử vào một tập hợp và phần tử đó đã được chứa trong tập hợp, thì tập hợp sẽ không thay đổi. cannot contain duplicates. Duplicates are discarded when initializing a set. If adding an element to a set, and that element is already contained in the set, then the set will not change.

Loại danh sách nào không cho phép trùng lặp?

Bản sao: ArrayList cho phép các giá trị trùng lặp trong khi Hashset không cho phép các giá trị trùng lặp.HashSet doesn't allow duplicates values.

Làm thế nào để bạn ngăn chặn các bản sao trong danh sách Python?

Nếu thứ tự của các phần tử không quan trọng, chúng ta có thể loại bỏ các bản sao bằng phương thức đã đặt và hàm độc đáo () numpy.Chúng ta có thể sử dụng các hàm gấu trúc, đặt hàng, giảm hàm (), đặt phương thức + sort () và các phương pháp lặp để giữ thứ tự của các phần tử.using the Set method and the Numpy unique() function. We can use Pandas functions, OrderedDict, reduce() function, Set + sort() method, and iterative approaches to keep the order of elements.

Làm thế nào để bạn tránh các bản sao trong một danh sách?

Xóa các bản sao khỏi hoạt động danh sách có một số lượng lớn các ứng dụng và do đó, kiến thức của nó là tốt để có ...
Phương pháp 1: Sử dụng *set ().
Phương pháp 2: Sử dụng danh sách hiểu ..
Phương pháp 3: Sử dụng Set ().
Phương pháp 4: Sử dụng danh sách hiểu + liệt kê ().