9 Câu hỏi: Xóa dict trùng lặp trong danh sách trong Python

câu hỏi được tạo ra tại Mon, Jan 11, 2016 12:00 AM

Tôi có một danh sách các dicts và tôi muốn xóa các dicts với các cặp khóa và giá trị giống hệt nhau.

Đối với danh sách này: 49 310

Tôi muốn trả lại cái này: 49 310

Một ví dụ khác:

Đối với danh sách này: 49 310

Tôi muốn trả lại cái này: 49 310

    
101
  1. Bạn có thể cho chúng tôi biết thêm về vấn đề thực tế bạn đang cố gắng giải quyết không? Đây có vẻ là một vấn đề kỳ lạ cần phải có.
    2012/02/24 07: 50: 51Z
  2. Tôi đang kết hợp một vài danh sách các dicts và có các bản sao. Vì vậy, tôi cần xóa những bản sao đó.
    2012/02/24 07: 51: 51Z
  3. Tôi đã tìm thấy một giải pháp trong stackoverflow.com/questions/480214/iêu trong câu trả lời mà không cần sử dụng trong số 49 310
    2016-06-13 10: 37: 43Z
9 Câu trả lời                              9                         

Hãy thử điều này:

 49 310

Chiến lược là chuyển đổi danh sách từ điển thành danh sách các bộ dữ liệu trong đó các bộ dữ liệu chứa các mục của từ điển. Vì các bộ dữ liệu có thể được băm, bạn có thể loại bỏ các bản sao bằng cách sử dụng 49 310 (sử dụng set hiểu ở đây, thay thế trăn cũ sẽ là 49 310) và sau đó, tạo lại từ điển từ bộ dữ liệu với 49 310.

trong đó:

  •  49 310 là danh sách ban đầu
  •  49 310 là một trong những từ điển trong danh sách
  •  49 310 là một trong những bộ dữ liệu được tạo từ từ điển

Chỉnh sửa: Nếu bạn muốn duy trì trật tự, lớp lót bên trên sẽ không hoạt động vì 49 310 sẽ không làm điều đó. Tuy nhiên, với một vài dòng mã, bạn cũng có thể làm điều đó:

 49 310

Kết quả ví dụ:

 49 310

Lưu ý: Như @alexis đã chỉ ra, có thể xảy ra việc hai từ điển có cùng khóa và giá trị, không dẫn đến cùng một bộ dữ liệu. Điều đó có thể xảy ra nếu họ trải qua một lịch sử thêm /xóa khóa khác. Nếu đó là trường hợp cho vấn đề của bạn, thì hãy xem xét sắp xếp 49 310 như anh ấy đề xuất.

    
175
2018-07-17 15: 26: 05Z
  1. trong ví dụ này, l là gì? (trong d trong l)
    2012 /02-24 07: 53: 52Z
  2. @ Brenden Tôi đã cập nhật câu trả lời với thông tin đó. 49 310 là danh sách bạn đang làm việc.
    2012/02/24 07: 56: 29Z
  3. Giải pháp hay nhưng nó có một lỗi: 49 310 không được đảm bảo để trả về các phần tử theo một thứ tự cụ thể. Bạn nên thực hiện 49 310 để đảm bảo bạn không nhận được các bộ dữ liệu khác nhau cho cùng một cặp giá trị khóa.
    2012 /02-24 14: 58: 59Z
  4. Lưu ý, điều này sẽ không hoạt động nếu bạn tải trong danh sách các ký tự từ mô-đun 49 310 như tôi đã làm
    2016-07-25 08: 19: 48Z
  5. Đây là một giải pháp hợp lệ trong trường hợp này, nhưng sẽ không hoạt động trong trường hợp từ điển lồng nhau
    2018-01-26 13: 06: 42Z

Một lớp lót khác dựa trên mức độ hiểu danh sách:

 49 310

Ở đây vì chúng tôi có thể sử dụng so sánh 49 310, chúng tôi chỉ giữ các yếu tố không nằm trong phần còn lại của danh sách ban đầu (khái niệm này chỉ có thể truy cập thông quachỉ số 49 310, do đó sử dụng 49 310).

    
38
2012 /02-24 09: 10: 56Z
  1. Điều này cũng hoạt động cho một danh sách từ điển bao gồm các danh sách được so sánh với câu trả lời đầu tiên
    2015-12 /02 08: 09: 00Z
  2. điều này cũng hoạt động khi bạn có thể có một loại không thể đánh giá là một giá trị trong từ điển của bạn, không giống như câu trả lời hàng đầu.
    2016 /02-01 12: 43: 22Z
  3. Điều này hiệu quả với tôi hơn là câu trả lời được chọn.
    2018-01-31 14: 27: 36Z
  4. ở đây, mục đích là để xóa các giá trị trùng lặp, không phải khóa, xem mã câu trả lời này
    2018-10-04 09: 40: 08Z

Đôi khi các vòng lặp kiểu cũ vẫn hữu ích. Mã này dài hơn một chút so với jcollado, nhưng rất dễ đọc:

 49 310     
14
2017-12-11 10: 50: 18Z
  1. Không cần thiết 49 310 trong 49 310.
    2018-02-08 18: 47: 58Z

Các câu trả lời khác sẽ không hoạt động nếu bạn đang hoạt động trên các từ điển lồng nhau, chẳng hạn như các đối tượng JSON được khử lưu huỳnh. Trong trường hợp này, bạn có thể sử dụng:

 49 310     
13
2016-08 /02 13: 52: 24Z
  1. Tuyệt vời! mẹo nhỏ là đối tượng dict không thể được thêm trực tiếp vào một tập hợp, nó cần được chuyển đổi thành đối tượng json bằng dump ().
    2019-05-08 01: 00: 11Z

Nếu bạn muốn duy trì Đơn hàng, thì bạn có thể thực hiện

 49 310

Nếu đơn hàng không thành vấn đề, thì bạn có thể làm

 49 310     
9
2014-04-29 07: 52: 59Z

Nếu sử dụng gói của bên thứ ba sẽ ổn thì bạn có thể sử dụng 49 310 :

 49 310

Trong trường hợp từ điển (so sánh độc lập với thứ tự), bạn cần ánh xạ nó tới một cấu trúc dữ liệu khác có thể so sánh như vậy, ví dụ: 49 310:

 49 310

Lưu ý rằng bạn không nên sử dụng cách tiếp cận 49 310 đơn giản (không sắp xếp) vì các từ điển bằng nhau không nhất thiết phải có cùng thứ tự (ngay cả trong Python 3.7 trong đó thứ tự chèn - không phải thứ tự tuyệt đối - là đảm bảo):

 49 310

Và thậm chí sắp xếp bộ dữ liệu có thể không hoạt động nếu các khóa không thể sắp xếp:

 49 310

Điểm chuẩn

Tôi nghĩ rằng có thể hữu ích khi xem hiệu suất của các phương pháp này so sánh như thế nào, vì vậy tôi đã làm một điểm chuẩn nhỏ. Các biểu đồ điểm chuẩn là thời gian so với kích thước danh sách dựa trên danh sách không chứa các mục trùng lặp (được chọn tùy ý, thời gian chạy không thay đổi sigđáng kể nếu tôi thêm một số hoặc nhiều bản sao). Đó là một biểu đồ log-log để phạm vi hoàn chỉnh được bao phủ.

Thời gian tuyệt đối:

 nhập mô tả hình ảnh tại đây

Thời gian liên quan đến cách tiếp cận nhanh nhất:

 nhập mô tả hình ảnh tại đây

Cách tiếp cận thứ hai từ thefourtheye là nhanh nhất tại đây. Cách tiếp cận 49 310 với chức năng 49 310 nằm ở vị trí thứ hai, tuy nhiên đó là cách tiếp cận nhanh nhất để duy trì trật tự. Các cách tiếp cận khác từ jcollado thefourtheye gần như nhanh chóng. Cách tiếp cận sử dụng 49 310 không có khóa và các giải pháp từ Emmanuel Scorpil rất chậm đối với các danh sách dài hơn và hành xử tệ hơn nhiều 49 310 thay vì 49 310. Cách tiếp cận của stpk với 49 310 không phải là 49 310 nhưng chậm hơn nhiều so với cách tiếp cận 49 310 tương tự.

Mã để tạo lại điểm chuẩn:

 49 310

Để hoàn thiện ở đây là thời gian cho một danh sách chỉ chứa các bản sao:

 49 310

 nhập mô tả hình ảnh tại đây

Thời gian không thay đổi đáng kể ngoại trừ chức năng 49 310 không có chức năng 49 310, trong trường hợp này là giải pháp nhanh nhất. Tuy nhiên, đó chỉ là trường hợp tốt nhất (không đại diện) cho hàm đó với các giá trị không thể thực hiện được vì thời gian chạy phụ thuộc vào số lượng giá trị duy nhất trong danh sách: 49 310 trong trường hợp này chỉ là 1 và do đó, nó chạy trong 49 310.

Tuyên bố miễn trừ trách nhiệm: Tôi là tác giả của 49 310.

    
5
2018-07-17 19: 43: 56Z

Nếu bạn đang sử dụng Pandas trong quy trình làm việc của mình, một tùy chọn là cung cấp danh sách từ điển trực tiếp cho hàm tạo 49 310. Sau đó, sử dụng 49 310 cho các kết quả bắt buộc.

 49 310     
5
2018-08-01 13: 34: 58Z

Không phải là câu trả lời chung , nhưng nếu danh sách của bạn tình cờ được sắp xếp theo một số phím, như thế này:

 49 310

thì giải pháp đơn giản như:

 49 310

Kết quả:

 49 310

Hoạt động với các từ điển lồng nhau và (rõ ràng) giữ trật tự.

    
1
2018-06-14 09: 22: 55Z

Bạn có thể sử dụng một bộ, nhưng bạn cần biến các ký tự thành loại có thể băm.

 49 310

Hiện tại duy nhất bằng

 49 310

Để lấy lại thông tin:

 49 310     
0
2012 /02-24 08: 03: 31Z
[{'a': 123}, {'b': 123}, {'a': 123}]
nguồn đặt đây