2011-09-15 24 views
6

tôi cần phải đoàn kết hai danh sách trong Python3, nơi bản sao có thể tồn tại, và cho một bộ các danh sách kết quả sẽ chứa bao nhiêu là tối đa trong cả hai ví dụ lists.An có thể làm rõ điều này:danh sách đoàn với bản sao

[1,2,2,5](some operator)[2,5,5,5,9]=[1,2,2,5,5,5,9] 

Ý tưởng?

Trả lời

12

Bạn có thể sử dụng lớp collections.Counter:

>>> from collections import Counter 
>>> combined = Counter([1,2,2,5]) | Counter([2,5,5,5,9]) 
>>> list(combined.elements()) 
[1, 2, 2, 5, 5, 5, 9] 

Nó hoạt động như một MultiSet (một bộ sưu tập có thứ tự trong đó mỗi phần tử có thể xuất hiện nhiều lần). Toán tử | mang đến cho bạn sự kết hợp của các multisets, trong đó mỗi phần tử xuất hiện tối đa (apperances_in_counter1, appearanceances_in_counter2) lần.

Lớp này được thêm vào bằng Python 2.7 và 3.1.

+0

đẹp ... Tôi không biết mô-đun đó. – kaiseroskilo

+0

hoạt động từ python 2.7 – varela

+1

Thật tuyệt, tôi không biết điều đó. Vì thuật ngữ "multiset" nghe giống như một từ thông dụng cho tôi, hãy để tôi trích dẫn mô tả của nó từ tài liệu Python: ** "Counter là một phân lớp dict để đếm các đối tượng băm." ** Tôi thấy mô tả này trực quan hơn, tôi hy vọng bạn cũng vậy. – Kos

1
  1. Chuyển đổi mảng tới các từ điển với a[key] = count

  2. Tạo từ điển mới với quy tắc c[key] = a.get(key, 0) > b.get(key, 0) and a[key] or b[key]. Bạn cần phải lặp qua cả hai khóa trong một và trong b dicts.

  3. Mở rộng điển, result += [value] * key

2

Tại sao sử dụng danh sách ở nơi đầu tiên? Dữ liệu đó trông giống như một dict với tôi:

[1,2,2,5] -> {1: 1, 2: 2, 5: 1} 
[2,5,5,5,9] -> {2: 1, 5: 3, 9: 1} 

Sau đó, nó đơn giản:

keys = set(a.keys()+b.keys()) 
vals = [max(a.get(n, 0), b.get(n, 0)) for n in keys] 
d = dict(zip(keys, vals)) 
print d 

Kết quả:

{1: 1, 2: 2, 5: 3, 9: 1}

+1

Cập nhật: sau câu trả lời của @ interjay, về cơ bản bạn có cùng một mô hình dữ liệu, nhưng đã được triển khai với các phương thức để hoạt động trên đó. Đi cho giải pháp đó! – Kos

Các vấn đề liên quan