Bộ python không trùng lặp

Trong phần này, chúng ta sẽ thử giải câu đố Xóa các bản sao trong Python bằng cách sử dụng ngôn ngữ máy tính. Mã sau đây phục vụ để minh họa điểm này

# remove duplicate from given_list using list comprehension
res = []
[res.append[x] for x in given_list if x not in res]

Dưới đây, bạn sẽ tìm thấy một số ví dụ về các cách khác nhau để giải quyết vấn đề Delete The Duplicates In Python

  mylist = ["a", "b", "a", "c", "c"]
mylist = list[dict.fromkeys[mylist]]
  print[mylist] 

Chúng tôi có thể hiểu cách khắc phục sự cố Xóa các bản sao trong Python nhờ có nhiều ví dụ

Làm cách nào để xóa các bản ghi trùng lặp trong Python?

5 cách để loại bỏ các bản sao khỏi danh sách trong Python

  • Phương pháp 1. Phương pháp ngây thơ
  • Phương pháp 2. Sử dụng một danh sách toàn diện
  • Phương pháp 3. Sử dụng bộ[]
  • Phương pháp 4. Sử dụng hiểu danh sách + liệt kê[]
  • Phương pháp 5. Sử dụng bộ sưu tập. Ra lệnhDict. fromkeys[]

Làm cách nào để xóa các mục trùng lặp khỏi danh sách?

Đưa ra một ArrayList có các giá trị trùng lặp, nhiệm vụ là xóa các giá trị trùng lặp khỏi ArrayList này trong Java. Cách tiếp cận

  • Nhận ArrayList với các giá trị trùng lặp
  • Tạo một Danh sách mới từ ArrayList này
  • Sử dụng Luồng []. phương thức riêng biệt [] trả về luồng đối tượng riêng biệt
  • chuyển đổi luồng đối tượng này thành Danh sách

Python có sắp xếp loại bỏ trùng lặp không?

Sử dụng sort[] Chúng ta có thể sử dụng phương thức sort[] để sắp xếp tập hợp mà chúng ta thu được ở cách 2. Điều này cũng sẽ loại bỏ bất kỳ bản sao nào, trong khi vẫn giữ nguyên thứ tự, nhưng chậm hơn so với chính tả

Làm thế nào để bạn tìm thấy các bản sao trong Python?

Nhiều cách để kiểm tra xem có tồn tại trùng lặp trong danh sách Python không

  • Độ dài của Danh sách và độ dài của Tập hợp khác nhau
  • Kiểm tra từng phần tử trong tập hợp. nếu có, dup, nếu không, thêm
  • Kiểm tra danh sách. đếm [] cho từng phần tử

Làm cách nào để loại bỏ các bản sao một cách nhanh chóng?

Làm cách nào để xóa nhiều bản sao khỏi danh sách trong Python?

Thao tác loại bỏ trùng lặp khỏi danh sách có một số lượng lớn ứng dụng và do đó, kiến ​​thức về nó rất tốt để có

  • Phương pháp 1. Sử dụng *set[]
  • Phương pháp 2. Sử dụng hiểu danh sách
  • Phương pháp 3. Sử dụng bộ[]
  • Phương pháp 4. Sử dụng hiểu danh sách + liệt kê[]

Bộ [] trong Python là gì?

Hàm set[] trong Python Hàm set[] tạo một đối tượng tập hợp. Các mục trong danh sách tập hợp không có thứ tự, vì vậy nó sẽ xuất hiện theo thứ tự ngẫu nhiên

Làm cách nào để lọc các bản sao?

Lọc các giá trị duy nhất hoặc xóa các giá trị trùng lặp

  • Để lọc các giá trị duy nhất, hãy nhấp vào Dữ liệu > Sắp xếp & Lọc > Nâng cao
  • Để xóa các giá trị trùng lặp, hãy nhấp vào Dữ liệu > Công cụ dữ liệu > Xóa các giá trị trùng lặp
  • Để đánh dấu các giá trị duy nhất hoặc trùng lặp, hãy sử dụng lệnh Định dạng có Điều kiện trong nhóm Kiểu trên tab Trang đầu

Tuple có loại bỏ Python trùng lặp không?

Phương pháp số 1. Sử dụng set[] + tuple[] Đây là cách đơn giản nhất để loại bỏ các bản sao. Trong phần này, chúng tôi chuyển đổi bộ dữ liệu thành một tập hợp, loại bỏ các bản sao và sau đó chuyển đổi lại bằng cách sử dụng tuple[]. 08-Aug-2022

Phương pháp này là phương pháp bậc hai, bởi vì chúng tôi có một tra cứu tuyến tính trong danh sách cho mọi phần tử của danh sách [chúng tôi phải thêm chi phí sắp xếp lại danh sách vì

In [91]: from random import randint, seed                                                                                            
In [92]: seed['20080808'] ; l = [randint[1,6] for _ in range[12]] # Beijing Olympics                                                                 
In [93]: for i in range[len[l]-1,0,-1]: 
    ...:     print[l] 
    ...:     print[i, l[i], l[:i], end=''] 
    ...:     if l[i] in l[:i]: 
    ...:          print[ ': remove', l[i]] 
    ...:          del l[i] 
    ...:     else: 
    ...:          print[] 
    ...: print[l]
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5, 2]
11 2 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]
10 5 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4]: remove 5
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4]
9 4 [6, 5, 1, 4, 6, 1, 6, 2, 2]: remove 4
[6, 5, 1, 4, 6, 1, 6, 2, 2]
8 2 [6, 5, 1, 4, 6, 1, 6, 2]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2]
7 2 [6, 5, 1, 4, 6, 1, 6]
[6, 5, 1, 4, 6, 1, 6, 2]
6 6 [6, 5, 1, 4, 6, 1]: remove 6
[6, 5, 1, 4, 6, 1, 2]
5 1 [6, 5, 1, 4, 6]: remove 1
[6, 5, 1, 4, 6, 2]
4 6 [6, 5, 1, 4]: remove 6
[6, 5, 1, 4, 2]
3 4 [6, 5, 1]
[6, 5, 1, 4, 2]
2 1 [6, 5]
[6, 5, 1, 4, 2]
1 5 [6]
[6, 5, 1, 4, 2]

In [94]:                                                                                                                             
5 s]

Nội dung chính Hiển thị

  • Phương pháp tại chỗ
  • Phương pháp 1 – Đối với vòng lặp
  • Phương pháp 2 – Liệt kê hiểu
  • Phương pháp 3 – Tập hợp được sắp xếp
  • Cách 4 – Dictionary fromkeys[]
  • Phương pháp 5 – more-itertools
  • Phương pháp 6 – NumPy duy nhất[]
  • Phương pháp 7 – gấu trúc độc nhất[]
  • Làm cách nào để xóa các mục trùng lặp khỏi thứ tự bảo quản danh sách?
  • Làm cách nào để loại bỏ các mục trùng lặp khỏi danh sách mà không thay đổi thứ tự trong Python?
  • Làm thế nào để bạn sắp xếp và loại bỏ các bản sao trong Python?
  • Làm thế nào để bạn duy trì thứ tự của một danh sách trong Python?

Điều đó nói rằng, có thể hoạt động tại chỗ nếu chúng ta bắt đầu từ cuối danh sách và tiến về gốc loại bỏ từng thuật ngữ có trong danh sách con ở bên trái của nó

Ý tưởng này trong mã chỉ đơn giản là

for i in range[len[l]-1,0,-1]: 
    if l[i] in l[:i]: del l[i] 

Một thử nghiệm đơn giản của việc thực hiện

In [91]: from random import randint, seed                                                                                            
In [92]: seed['20080808'] ; l = [randint[1,6] for _ in range[12]] # Beijing Olympics                                                                 
In [93]: for i in range[len[l]-1,0,-1]: 
    ...:     print[l] 
    ...:     print[i, l[i], l[:i], end=''] 
    ...:     if l[i] in l[:i]: 
    ...:          print[ ': remove', l[i]] 
    ...:          del l[i] 
    ...:     else: 
    ...:          print[] 
    ...: print[l]
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5, 2]
11 2 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]
10 5 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4]: remove 5
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4]
9 4 [6, 5, 1, 4, 6, 1, 6, 2, 2]: remove 4
[6, 5, 1, 4, 6, 1, 6, 2, 2]
8 2 [6, 5, 1, 4, 6, 1, 6, 2]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2]
7 2 [6, 5, 1, 4, 6, 1, 6]
[6, 5, 1, 4, 6, 1, 6, 2]
6 6 [6, 5, 1, 4, 6, 1]: remove 6
[6, 5, 1, 4, 6, 1, 2]
5 1 [6, 5, 1, 4, 6]: remove 1
[6, 5, 1, 4, 6, 2]
4 6 [6, 5, 1, 4]: remove 6
[6, 5, 1, 4, 2]
3 4 [6, 5, 1]
[6, 5, 1, 4, 2]
2 1 [6, 5]
[6, 5, 1, 4, 2]
1 5 [6]
[6, 5, 1, 4, 2]

In [94]:                                                                                                                             

Loại bỏ các bản sao khỏi danh sách khá đơn giản. Bạn có thể làm điều đó với Python one-liner.  

>>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
>>> result = list[set[initial]]
>>> result
[1, 7, 9, 6]

Các phần tử tập hợp Python phải là duy nhất để chuyển đổi một danh sách thành một tập hợp và ngược lại đạt được kết quả mong muốn

Điều gì xảy ra nếu thứ tự ban đầu của danh sách là quan trọng?

May mắn thay, có một số cách để khắc phục vấn đề này. Trong bài viết này, chúng ta sẽ xem xét một loạt các giải pháp khác nhau cho vấn đề và xem xét giá trị tương đối của chúng.  

  • Phương pháp 1 – Đối với vòng lặp
  • Phương pháp 2 – Liệt kê hiểu
  • Phương pháp 3 – Tập hợp được sắp xếp
  • Cách 4 – Dictionary fromkeys[]
  • Phương pháp 5 – more-itertools
  • Phương pháp 6 – NumPy duy nhất[]
  • Phương pháp 7 – gấu trúc độc nhất[]
  • Bản tóm tắt

Phương pháp 1 – Đối với vòng lặp

Một cách cơ bản để đạt được kết quả cần thiết là sử dụng vòng lặp for

 >>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
 >>> result = []
 >>> for item in initial:
         if item not in result:
             result.append[item]
 >>> result
 
 [1, 9, 6, 7]


Cách tiếp cận này ít nhất có lợi thế là dễ đọc và dễ hiểu. Mặc dù vậy, nó khá kém hiệu quả vì việc kiểm tra

In [91]: from random import randint, seed                                                                                            
In [92]: seed['20080808'] ; l = [randint[1,6] for _ in range[12]] # Beijing Olympics                                                                 
In [93]: for i in range[len[l]-1,0,-1]: 
    ...:     print[l] 
    ...:     print[i, l[i], l[:i], end=''] 
    ...:     if l[i] in l[:i]: 
    ...:          print[ ': remove', l[i]] 
    ...:          del l[i] 
    ...:     else: 
    ...:          print[] 
    ...: print[l]
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5, 2]
11 2 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]
10 5 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4]: remove 5
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4]
9 4 [6, 5, 1, 4, 6, 1, 6, 2, 2]: remove 4
[6, 5, 1, 4, 6, 1, 6, 2, 2]
8 2 [6, 5, 1, 4, 6, 1, 6, 2]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2]
7 2 [6, 5, 1, 4, 6, 1, 6]
[6, 5, 1, 4, 6, 1, 6, 2]
6 6 [6, 5, 1, 4, 6, 1]: remove 6
[6, 5, 1, 4, 6, 1, 2]
5 1 [6, 5, 1, 4, 6]: remove 1
[6, 5, 1, 4, 6, 2]
4 6 [6, 5, 1, 4]: remove 6
[6, 5, 1, 4, 2]
3 4 [6, 5, 1]
[6, 5, 1, 4, 2]
2 1 [6, 5]
[6, 5, 1, 4, 2]
1 5 [6]
[6, 5, 1, 4, 2]

In [94]:                                                                                                                             
6n đang được hoàn thành cho mọi phần tử của danh sách
In [91]: from random import randint, seed                                                                                            
In [92]: seed['20080808'] ; l = [randint[1,6] for _ in range[12]] # Beijing Olympics                                                                 
In [93]: for i in range[len[l]-1,0,-1]: 
    ...:     print[l] 
    ...:     print[i, l[i], l[:i], end=''] 
    ...:     if l[i] in l[:i]: 
    ...:          print[ ': remove', l[i]] 
    ...:          del l[i] 
    ...:     else: 
    ...:          print[] 
    ...: print[l]
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5, 2]
11 2 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]
10 5 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4]: remove 5
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4]
9 4 [6, 5, 1, 4, 6, 1, 6, 2, 2]: remove 4
[6, 5, 1, 4, 6, 1, 6, 2, 2]
8 2 [6, 5, 1, 4, 6, 1, 6, 2]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2]
7 2 [6, 5, 1, 4, 6, 1, 6]
[6, 5, 1, 4, 6, 1, 6, 2]
6 6 [6, 5, 1, 4, 6, 1]: remove 6
[6, 5, 1, 4, 6, 1, 2]
5 1 [6, 5, 1, 4, 6]: remove 1
[6, 5, 1, 4, 6, 2]
4 6 [6, 5, 1, 4]: remove 6
[6, 5, 1, 4, 2]
3 4 [6, 5, 1]
[6, 5, 1, 4, 2]
2 1 [6, 5]
[6, 5, 1, 4, 2]
1 5 [6]
[6, 5, 1, 4, 2]

In [94]:                                                                                                                             
7.  

Đó có thể không phải là vấn đề với ví dụ đơn giản này, nhưng chi phí thời gian sẽ ngày càng rõ ràng nếu danh sách trở nên rất lớn

Phương pháp 2 – Liệt kê hiểu

Làm cách nào để xóa các bản sao khỏi danh sách Python?

Một cách khác là sử dụng cách hiểu danh sách

 >>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
 >>> result = []
 >>> [result.append[item] for item in initial if item not in result]
 [None, None, None, None]
 >>> result
 
 [1, 9, 6, 7]

Khả năng hiểu danh sách là các công cụ Python tiện dụng và rất mạnh mẽ cho phép bạn kết hợp các biến, vòng lặp for và câu lệnh if. Chúng cho phép tạo danh sách với một dòng mã [nhưng bạn cũng có thể chia chúng thành nhiều dòng để cải thiện khả năng đọc. ]

Mặc dù ngắn hơn và vẫn khá rõ ràng, nhưng sử dụng cách hiểu danh sách trong trường hợp này không phải là một ý kiến ​​hay

Đó là bởi vì nó sử dụng cùng một cách tiếp cận không hiệu quả để kiểm tra tư cách thành viên mà chúng ta đã thấy trong Phương pháp 1. Nó cũng dựa vào các tác dụng phụ của việc hiểu để xây dựng danh sách kết quả, điều mà nhiều người cho là không tốt

Để giải thích thêm, ngay cả khi nó không được gán cho một biến để sử dụng sau này, thì việc hiểu danh sách vẫn tạo ra một đối tượng danh sách. Vì vậy, trong quá trình nối thêm các mục từ danh sách ban đầu vào danh sách

In [91]: from random import randint, seed                                                                                            
In [92]: seed['20080808'] ; l = [randint[1,6] for _ in range[12]] # Beijing Olympics                                                                 
In [93]: for i in range[len[l]-1,0,-1]: 
    ...:     print[l] 
    ...:     print[i, l[i], l[:i], end=''] 
    ...:     if l[i] in l[:i]: 
    ...:          print[ ': remove', l[i]] 
    ...:          del l[i] 
    ...:     else: 
    ...:          print[] 
    ...: print[l]
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5, 2]
11 2 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]
10 5 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4]: remove 5
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4]
9 4 [6, 5, 1, 4, 6, 1, 6, 2, 2]: remove 4
[6, 5, 1, 4, 6, 1, 6, 2, 2]
8 2 [6, 5, 1, 4, 6, 1, 6, 2]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2]
7 2 [6, 5, 1, 4, 6, 1, 6]
[6, 5, 1, 4, 6, 1, 6, 2]
6 6 [6, 5, 1, 4, 6, 1]: remove 6
[6, 5, 1, 4, 6, 1, 2]
5 1 [6, 5, 1, 4, 6]: remove 1
[6, 5, 1, 4, 6, 2]
4 6 [6, 5, 1, 4]: remove 6
[6, 5, 1, 4, 2]
3 4 [6, 5, 1]
[6, 5, 1, 4, 2]
2 1 [6, 5]
[6, 5, 1, 4, 2]
1 5 [6]
[6, 5, 1, 4, 2]

In [94]:                                                                                                                             
8, mã của chúng tôi cũng đang tạo danh sách thứ ba chứa giá trị trả về của mỗi lệnh gọi
In [91]: from random import randint, seed                                                                                            
In [92]: seed['20080808'] ; l = [randint[1,6] for _ in range[12]] # Beijing Olympics                                                                 
In [93]: for i in range[len[l]-1,0,-1]: 
    ...:     print[l] 
    ...:     print[i, l[i], l[:i], end=''] 
    ...:     if l[i] in l[:i]: 
    ...:          print[ ': remove', l[i]] 
    ...:          del l[i] 
    ...:     else: 
    ...:          print[] 
    ...: print[l]
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5, 2]
11 2 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]
10 5 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4]: remove 5
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4]
9 4 [6, 5, 1, 4, 6, 1, 6, 2, 2]: remove 4
[6, 5, 1, 4, 6, 1, 6, 2, 2]
8 2 [6, 5, 1, 4, 6, 1, 6, 2]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2]
7 2 [6, 5, 1, 4, 6, 1, 6]
[6, 5, 1, 4, 6, 1, 6, 2]
6 6 [6, 5, 1, 4, 6, 1]: remove 6
[6, 5, 1, 4, 6, 1, 2]
5 1 [6, 5, 1, 4, 6]: remove 1
[6, 5, 1, 4, 6, 2]
4 6 [6, 5, 1, 4]: remove 6
[6, 5, 1, 4, 2]
3 4 [6, 5, 1]
[6, 5, 1, 4, 2]
2 1 [6, 5]
[6, 5, 1, 4, 2]
1 5 [6]
[6, 5, 1, 4, 2]

In [94]:                                                                                                                             
9

Các hàm Python trả về giá trị

>>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
>>> result = list[set[initial]]
>>> result
[1, 7, 9, 6]
0 nếu không có giá trị trả về nào khác được chỉ định, nghĩa là [như bạn có thể thấy ở trên] đầu ra từ danh sách thứ ba là.  

  mylist = ["a", "b", "a", "c", "c"]
mylist = list[dict.fromkeys[mylist]]
  print[mylist] 
3

Vòng lặp for rõ ràng hơn và không phụ thuộc vào tác dụng phụ, vì vậy đây là phương pháp tốt hơn cho cả hai trong trường hợp này

Phương pháp 3 – Tập hợp được sắp xếp

Chúng tôi không thể đơn giản chuyển đổi danh sách của mình thành một bộ để loại bỏ các bản sao nếu chúng tôi muốn giữ trật tự. Tuy nhiên, sử dụng phương pháp này kết hợp với chức năng được sắp xếp là một cách tiềm năng khác về phía trước

  mylist = ["a", "b", "a", "c", "c"]
mylist = list[dict.fromkeys[mylist]]
  print[mylist] 
4


Như bạn có thể thấy, phương thức này sử dụng chỉ mục của danh sách ban đầu để sắp xếp tập hợp các giá trị duy nhất theo đúng thứ tự

Vấn đề là mặc dù nó khá dễ hiểu nhưng nó không nhanh hơn nhiều so với vòng lặp for cơ bản được trình bày trong Phương pháp 1

Cách 4 – Dictionary fromkeys[]

Một cách tiếp cận nhanh chóng nghiêm túc là sử dụng từ điển

  mylist = ["a", "b", "a", "c", "c"]
mylist = list[dict.fromkeys[mylist]]
  print[mylist] 
5


Giống như bộ, từ điển sử dụng bảng băm, có nghĩa là chúng cực kỳ nhanh

Các khóa từ điển Python là duy nhất theo mặc định, vì vậy việc chuyển đổi danh sách của chúng tôi thành từ điển sẽ tự động loại bỏ các bản trùng lặp

Phương thức

>>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
>>> result = list[set[initial]]
>>> result
[1, 7, 9, 6]
1 tạo một từ điển mới bằng cách sử dụng các phần tử từ một lần lặp làm khóa.  

Khi điều này đã được thực hiện với danh sách ban đầu của chúng tôi, việc chuyển đổi từ điển trở lại danh sách sẽ cho kết quả mà chúng tôi đang tìm kiếm

Từ điển chỉ được đặt hàng trong tất cả các triển khai python khi Python 3. 7 đã được phát hành [đây cũng là chi tiết triển khai của CPython 3. 6].  

Vì vậy, nếu bạn đang sử dụng phiên bản Python cũ hơn, bạn sẽ cần nhập lớp

>>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
>>> result = list[set[initial]]
>>> result
[1, 7, 9, 6]
2 từ gói bộ sưu tập trong thư viện chuẩn để thay thế

  mylist = ["a", "b", "a", "c", "c"]
mylist = list[dict.fromkeys[mylist]]
  print[mylist] 
8

Cách tiếp cận này có thể không nhanh bằng cách sử dụng từ điển tiêu chuẩn, nhưng nó vẫn rất nhanh

Tập thể dục. Chạy mã. Nó có hoạt động không?

Phương pháp 5 – more-itertools

Cho đến thời điểm này, chúng tôi chỉ xem xét các danh sách chứa các mục không thay đổi. Nhưng nếu danh sách của bạn chứa các kiểu dữ liệu có thể thay đổi như danh sách, bộ hoặc từ điển thì sao?

Vẫn có thể sử dụng vòng lặp for cơ bản được hiển thị trong Phương pháp 1, nhưng điều đó sẽ không quá khó nếu tốc độ là điều cốt yếu

Ngoài ra, nếu chúng tôi cố gắng sử dụng

>>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
>>> result = list[set[initial]]
>>> result
[1, 7, 9, 6]
1, chúng tôi sẽ nhận được một
>>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
>>> result = list[set[initial]]
>>> result
[1, 7, 9, 6]
4 vì các khóa từ điển phải có thể băm được

Một câu trả lời tuyệt vời cho câu hỏi hóc búa này xuất hiện dưới dạng một thư viện có tên more-itertools. Nó không phải là một phần của thư viện chuẩn Python nên bạn sẽ cần cài đặt nó

Khi đã xong, bạn có thể nhập và sử dụng chức năng

>>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
>>> result = list[set[initial]]
>>> result
[1, 7, 9, 6]
5 của nó như vậy

In [91]: from random import randint, seed                                                                                            
In [92]: seed['20080808'] ; l = [randint[1,6] for _ in range[12]] # Beijing Olympics                                                                 
In [93]: for i in range[len[l]-1,0,-1]: 
    ...:     print[l] 
    ...:     print[i, l[i], l[:i], end=''] 
    ...:     if l[i] in l[:i]: 
    ...:          print[ ': remove', l[i]] 
    ...:          del l[i] 
    ...:     else: 
    ...:          print[] 
    ...: print[l]
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5, 2]
11 2 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]
10 5 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4]: remove 5
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4]
9 4 [6, 5, 1, 4, 6, 1, 6, 2, 2]: remove 4
[6, 5, 1, 4, 6, 1, 6, 2, 2]
8 2 [6, 5, 1, 4, 6, 1, 6, 2]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2]
7 2 [6, 5, 1, 4, 6, 1, 6]
[6, 5, 1, 4, 6, 1, 6, 2]
6 6 [6, 5, 1, 4, 6, 1]: remove 6
[6, 5, 1, 4, 6, 1, 2]
5 1 [6, 5, 1, 4, 6]: remove 1
[6, 5, 1, 4, 6, 2]
4 6 [6, 5, 1, 4]: remove 6
[6, 5, 1, 4, 2]
3 4 [6, 5, 1]
[6, 5, 1, 4, 2]
2 1 [6, 5]
[6, 5, 1, 4, 2]
1 5 [6]
[6, 5, 1, 4, 2]

In [94]:                                                                                                                             
2

Thư viện

>>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
>>> result = list[set[initial]]
>>> result
[1, 7, 9, 6]
6 được thiết kế đặc biệt để làm việc với các kiểu dữ liệu có thể lặp lại của Python theo cách hiệu quả [nó bổ sung cho các công cụ lặp là một phần của thư viện chuẩn]

Hàm

>>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
>>> result = list[set[initial]]
>>> result
[1, 7, 9, 6]
5 mang lại các phần tử duy nhất trong khi vẫn giữ nguyên trật tự và đặc biệt là nó có thể xử lý các loại dữ liệu có thể thay đổi, vì vậy, đây chính xác là thứ chúng tôi đang tìm kiếm

Chức năng này cũng cung cấp một cách để loại bỏ các mục trùng lặp nhanh hơn khỏi danh sách các danh sách

In [91]: from random import randint, seed                                                                                            
In [92]: seed['20080808'] ; l = [randint[1,6] for _ in range[12]] # Beijing Olympics                                                                 
In [93]: for i in range[len[l]-1,0,-1]: 
    ...:     print[l] 
    ...:     print[i, l[i], l[:i], end=''] 
    ...:     if l[i] in l[:i]: 
    ...:          print[ ': remove', l[i]] 
    ...:          del l[i] 
    ...:     else: 
    ...:          print[] 
    ...: print[l]
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5, 2]
11 2 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]
10 5 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4]: remove 5
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4]
9 4 [6, 5, 1, 4, 6, 1, 6, 2, 2]: remove 4
[6, 5, 1, 4, 6, 1, 6, 2, 2]
8 2 [6, 5, 1, 4, 6, 1, 6, 2]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2]
7 2 [6, 5, 1, 4, 6, 1, 6]
[6, 5, 1, 4, 6, 1, 6, 2]
6 6 [6, 5, 1, 4, 6, 1]: remove 6
[6, 5, 1, 4, 6, 1, 2]
5 1 [6, 5, 1, 4, 6]: remove 1
[6, 5, 1, 4, 6, 2]
4 6 [6, 5, 1, 4]: remove 6
[6, 5, 1, 4, 2]
3 4 [6, 5, 1]
[6, 5, 1, 4, 2]
2 1 [6, 5]
[6, 5, 1, 4, 2]
1 5 [6]
[6, 5, 1, 4, 2]

In [94]:                                                                                                                             
0

Điều này hoạt động tốt vì nó chuyển đổi các danh sách không thể băm thành các bộ có thể băm để tăng tốc mọi thứ hơn nữa

Nếu bạn muốn áp dụng thủ thuật này cho danh sách các bộ, bạn có thể sử dụng freezeset làm khóa

In [91]: from random import randint, seed                                                                                            
In [92]: seed['20080808'] ; l = [randint[1,6] for _ in range[12]] # Beijing Olympics                                                                 
In [93]: for i in range[len[l]-1,0,-1]: 
    ...:     print[l] 
    ...:     print[i, l[i], l[:i], end=''] 
    ...:     if l[i] in l[:i]: 
    ...:          print[ ': remove', l[i]] 
    ...:          del l[i] 
    ...:     else: 
    ...:          print[] 
    ...: print[l]
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5, 2]
11 2 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]
10 5 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4]: remove 5
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4]
9 4 [6, 5, 1, 4, 6, 1, 6, 2, 2]: remove 4
[6, 5, 1, 4, 6, 1, 6, 2, 2]
8 2 [6, 5, 1, 4, 6, 1, 6, 2]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2]
7 2 [6, 5, 1, 4, 6, 1, 6]
[6, 5, 1, 4, 6, 1, 6, 2]
6 6 [6, 5, 1, 4, 6, 1]: remove 6
[6, 5, 1, 4, 6, 1, 2]
5 1 [6, 5, 1, 4, 6]: remove 1
[6, 5, 1, 4, 6, 2]
4 6 [6, 5, 1, 4]: remove 6
[6, 5, 1, 4, 2]
3 4 [6, 5, 1]
[6, 5, 1, 4, 2]
2 1 [6, 5]
[6, 5, 1, 4, 2]
1 5 [6]
[6, 5, 1, 4, 2]

In [94]:                                                                                                                             
1

Chỉ định khóa với danh sách từ điển phức tạp hơn một chút nhưng vẫn có thể đạt được với sự trợ giúp của hàm lambda

In [91]: from random import randint, seed                                                                                            
In [92]: seed['20080808'] ; l = [randint[1,6] for _ in range[12]] # Beijing Olympics                                                                 
In [93]: for i in range[len[l]-1,0,-1]: 
    ...:     print[l] 
    ...:     print[i, l[i], l[:i], end=''] 
    ...:     if l[i] in l[:i]: 
    ...:          print[ ': remove', l[i]] 
    ...:          del l[i] 
    ...:     else: 
    ...:          print[] 
    ...: print[l]
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5, 2]
11 2 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]
10 5 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4]: remove 5
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4]
9 4 [6, 5, 1, 4, 6, 1, 6, 2, 2]: remove 4
[6, 5, 1, 4, 6, 1, 6, 2, 2]
8 2 [6, 5, 1, 4, 6, 1, 6, 2]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2]
7 2 [6, 5, 1, 4, 6, 1, 6]
[6, 5, 1, 4, 6, 1, 6, 2]
6 6 [6, 5, 1, 4, 6, 1]: remove 6
[6, 5, 1, 4, 6, 1, 2]
5 1 [6, 5, 1, 4, 6]: remove 1
[6, 5, 1, 4, 6, 2]
4 6 [6, 5, 1, 4]: remove 6
[6, 5, 1, 4, 2]
3 4 [6, 5, 1]
[6, 5, 1, 4, 2]
2 1 [6, 5]
[6, 5, 1, 4, 2]
1 5 [6]
[6, 5, 1, 4, 2]

In [94]:                                                                                                                             
2

Hàm

>>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
>>> result = list[set[initial]]
>>> result
[1, 7, 9, 6]
5 cũng có thể được sử dụng với các danh sách chứa hỗn hợp các mục có thể lặp lại và không thể lặp lại [nghĩ rằng số nguyên và số thực], đây là một phần thưởng thực sự. Cố gắng cung cấp một khóa trong trường hợp này sẽ dẫn đến một
>>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
>>> result = list[set[initial]]
>>> result
[1, 7, 9, 6]
4 mặc dù

Phương pháp 6 – NumPy duy nhất[]

Nếu bạn đang làm việc với dữ liệu số, thư viện bên thứ ba numpy cũng là một tùy chọn

In [91]: from random import randint, seed                                                                                            
In [92]: seed['20080808'] ; l = [randint[1,6] for _ in range[12]] # Beijing Olympics                                                                 
In [93]: for i in range[len[l]-1,0,-1]: 
    ...:     print[l] 
    ...:     print[i, l[i], l[:i], end=''] 
    ...:     if l[i] in l[:i]: 
    ...:          print[ ': remove', l[i]] 
    ...:          del l[i] 
    ...:     else: 
    ...:          print[] 
    ...: print[l]
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5, 2]
11 2 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]
10 5 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4]: remove 5
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4]
9 4 [6, 5, 1, 4, 6, 1, 6, 2, 2]: remove 4
[6, 5, 1, 4, 6, 1, 6, 2, 2]
8 2 [6, 5, 1, 4, 6, 1, 6, 2]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2]
7 2 [6, 5, 1, 4, 6, 1, 6]
[6, 5, 1, 4, 6, 1, 6, 2]
6 6 [6, 5, 1, 4, 6, 1]: remove 6
[6, 5, 1, 4, 6, 1, 2]
5 1 [6, 5, 1, 4, 6]: remove 1
[6, 5, 1, 4, 6, 2]
4 6 [6, 5, 1, 4]: remove 6
[6, 5, 1, 4, 2]
3 4 [6, 5, 1]
[6, 5, 1, 4, 2]
2 1 [6, 5]
[6, 5, 1, 4, 2]
1 5 [6]
[6, 5, 1, 4, 2]

In [94]:                                                                                                                             
3

Giá trị chỉ mục của các mục duy nhất có thể được lưu trữ bằng cách sử dụng hàm

 >>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
 >>> result = []
 >>> for item in initial:
         if item not in result:
             result.append[item]
 >>> result
 
 [1, 9, 6, 7]
0 với tham số
 >>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
 >>> result = []
 >>> for item in initial:
         if item not in result:
             result.append[item]
 >>> result
 
 [1, 9, 6, 7]
1 được đặt thành
 >>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
 >>> result = []
 >>> for item in initial:
         if item not in result:
             result.append[item]
 >>> result
 
 [1, 9, 6, 7]
2

Những thứ này sau đó có thể được chuyển đến

 >>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
 >>> result = []
 >>> for item in initial:
         if item not in result:
             result.append[item]
 >>> result
 
 [1, 9, 6, 7]
3 để tạo ra một lát cắt được sắp xếp chính xác với các bản sao đã bị xóa

Về mặt kỹ thuật, phương pháp này có thể được áp dụng cho một danh sách tiêu chuẩn bằng cách trước tiên chuyển đổi nó thành một mảng có nhiều mảng và sau đó chuyển đổi nó trở lại định dạng danh sách ở cuối. Tuy nhiên, đây sẽ là một cách quá phức tạp và không hiệu quả để đạt được kết quả.

Sử dụng các loại kỹ thuật này chỉ thực sự có ý nghĩa nếu bạn cũng đang sử dụng một số tính năng mạnh mẽ của numpy vì những lý do khác

Phương pháp 7 – gấu trúc độc nhất[]

Một thư viện bên thứ ba khác mà chúng tôi có thể sử dụng là pandas

In [91]: from random import randint, seed                                                                                            
In [92]: seed['20080808'] ; l = [randint[1,6] for _ in range[12]] # Beijing Olympics                                                                 
In [93]: for i in range[len[l]-1,0,-1]: 
    ...:     print[l] 
    ...:     print[i, l[i], l[:i], end=''] 
    ...:     if l[i] in l[:i]: 
    ...:          print[ ': remove', l[i]] 
    ...:          del l[i] 
    ...:     else: 
    ...:          print[] 
    ...: print[l]
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5, 2]
11 2 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4, 5]
10 5 [6, 5, 1, 4, 6, 1, 6, 2, 2, 4]: remove 5
[6, 5, 1, 4, 6, 1, 6, 2, 2, 4]
9 4 [6, 5, 1, 4, 6, 1, 6, 2, 2]: remove 4
[6, 5, 1, 4, 6, 1, 6, 2, 2]
8 2 [6, 5, 1, 4, 6, 1, 6, 2]: remove 2
[6, 5, 1, 4, 6, 1, 6, 2]
7 2 [6, 5, 1, 4, 6, 1, 6]
[6, 5, 1, 4, 6, 1, 6, 2]
6 6 [6, 5, 1, 4, 6, 1]: remove 6
[6, 5, 1, 4, 6, 1, 2]
5 1 [6, 5, 1, 4, 6]: remove 1
[6, 5, 1, 4, 6, 2]
4 6 [6, 5, 1, 4]: remove 6
[6, 5, 1, 4, 2]
3 4 [6, 5, 1]
[6, 5, 1, 4, 2]
2 1 [6, 5]
[6, 5, 1, 4, 2]
1 5 [6]
[6, 5, 1, 4, 2]

In [94]:                                                                                                                             
4

 >>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
 >>> result = []
 >>> for item in initial:
         if item not in result:
             result.append[item]
 >>> result
 
 [1, 9, 6, 7]
4 phù hợp hơn với nhiệm vụ vì nó giữ trật tự theo mặc định và
 >>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
 >>> result = []
 >>> for item in initial:
         if item not in result:
             result.append[item]
 >>> result
 
 [1, 9, 6, 7]
5 nhanh hơn đáng kể so với
 >>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
 >>> result = []
 >>> for item in initial:
         if item not in result:
             result.append[item]
 >>> result
 
 [1, 9, 6, 7]
0

Như với phương pháp numpy, hoàn toàn có thể chuyển đổi kết quả thành danh sách tiêu chuẩn ở cuối

Tuy nhiên, một lần nữa, trừ khi bạn đang sử dụng các công cụ phân tích dữ liệu tuyệt vời do gấu trúc cung cấp cho mục đích khác, không có lý do rõ ràng nào để chọn phương pháp này thay vì tùy chọn nhanh hơn bằng cách sử dụng kiểu dữ liệu từ điển tích hợp sẵn của Python [Phương pháp 4]

Bản tóm tắt

Như chúng ta đã thấy, có rất nhiều cách để giải quyết vấn đề này và quyết định chọn cách nào sẽ tùy thuộc vào hoàn cảnh cụ thể của bạn.  

Nếu bạn đang viết một kịch bản nhanh và danh sách của bạn không nhiều, bạn có thể chọn sử dụng một vòng lặp for đơn giản vì mục đích rõ ràng

Tuy nhiên, nếu tính hiệu quả là một yếu tố và danh sách của bạn không chứa các mục có thể thay đổi thì sử dụng

>>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
>>> result = list[set[initial]]
>>> result
[1, 7, 9, 6]
1 là một lựa chọn tuyệt vời. Thật tuyệt khi phương pháp này sử dụng một trong các kiểu dữ liệu tích hợp sẵn của Python và duy trì mức độ dễ đọc tốt trong khi cải thiện ồ ạt tốc độ của vòng lặp for

Ngoài ra, nếu bạn đang sử dụng phiên bản Python cũ hơn, thì

 >>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
 >>> result = []
 >>> for item in initial:
         if item not in result:
             result.append[item]
 >>> result
 
 [1, 9, 6, 7]
8 là một lựa chọn thực sự tốt vì nó vẫn rất nhanh

Nếu bạn cần làm việc với các danh sách chứa các mục có thể thay đổi, việc nhập more-itertools để bạn có thể tận dụng chức năng tuyệt vời

>>> initial = [1, 1, 9, 1, 9, 6, 9, 7]
>>> result = list[set[initial]]
>>> result
[1, 7, 9, 6]
5 sẽ rất có ý nghĩa

Cuối cùng, nếu bạn đang thực hiện một số thao tác số nghiêm trọng với dữ liệu gọn gàng hoặc thao tác với gấu trúc, thì có lẽ nên sử dụng các phương thức được tích hợp trong các công cụ đó cho mục đích này.  

Tất nhiên, sự lựa chọn là của bạn và tôi hy vọng bài viết này đã cung cấp một số thông tin chi tiết hữu ích giúp bạn chọn được cách tiếp cận phù hợp cho công việc hiện tại

Làm cách nào để xóa các mục trùng lặp khỏi thứ tự bảo quản danh sách?

Thao tác loại bỏ trùng lặp khỏi danh sách có một số lượng lớn ứng dụng và do đó, kiến ​​thức về nó rất tốt để có

Chủ Đề