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]:
9Cá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]:
2Thư 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]:
1Chỉ đị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]:
2Hà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]:
3Giá 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ó