2014-11-13 47 views
6

Tôi đang cố gắng để kết hợp ba từ điển, mà tất cả đều có các phím tương tự, và một trong hai danh sách các giá trị, hoặc các giá trị duy nhất.sáp nhập danh sách giá trị từ điển trong python

one={'a': [1, 2], 'c': [5, 6], 'b': [3, 4]} 
two={'a': [2.4, 3.4], 'c': [5.6, 7.6], 'b': [3.5, 4.5]} 
three={'a': 1.2, 'c': 3.4, 'b': 2.3} 

Những gì tôi cần là cho tất cả các mục trong các giá trị được bổ sung vào một danh sách.

result={'a': [1, 2, 2.4, 3.4, 1.2], 'c': [5, 6, 5.6, 7.6, 2.3], 'b': [3, 4, 3.5, 4.5, 3.4]} 

Tôi đã thử nhiều thứ, nhưng hầu hết đặt giá trị vào danh sách lồng nhau. Ví dụ:

out=dict((k, [one[k], two.get(k), three.get(k)]) for k in one) 
{'a': [[1, 2], [2.4, 3.4], 1.2], 'c': [[5, 6], [5.6, 7.6], 3.4], 'b': [[3, 4], [3.5, 4.5], 2.3]} 

tôi đã cố gắng cập nhật nó bằng cách lặp qua các giá trị:

out.update((k, [x for x in v]) for k,v in out.iteritems()) 

nhưng kết quả là giống hệt nhau. Tôi đã cố gắng chỉ đơn giản là thêm các danh sách, nhưng vì từ điển thứ ba chỉ có một phao, tôi không thể làm điều đó.

check=dict((k, [one[k]+two[k]+three[k]]) for k in one) 

Vì vậy, tôi cố gắng đầu tiên thêm danh sách các giá trị của một và hai, và sau đó thêm giá trị của ba. Thêm danh sách làm việc tốt, nhưng sau đó khi tôi đã cố gắng để gắn phao từ điển thứ ba, đột nhiên toàn bộ giá trị đi đến 'Không'

check=dict((k, [one[k]+two[k]]) for k in one) 
{'a': [[1, 2, 2.4, 3.4]], 'c': [[5, 6, 5.6, 7.6]], 'b': [[3, 4, 3.5, 4.5]]} 
new=dict((k, v.append(three[k])) for k,v in check.items()) 
{'a': None, 'c': None, 'b': None} 

Trả lời

8

Là một one-liner, với một sự hiểu biết từ điển:

new = {key: value + two[key] + [three[key]] for key, value in one.iteritems()} 

Điều này tạo danh sách mới, nối danh sách từ one với danh sách tương ứng từ two, đặt giá trị đơn lẻ trong three vào danh sách tạm thời để ghép nối dễ dàng hơn.

Hoặc với một vòng lặp for cập nhật one tại chỗ:

for key, value in one.iteritems(): 
    value.extend(two[key]) 
    value.append(three[key]) 

này sử dụng list.extend() để cập nhật danh sách ban đầu tại chỗ với danh sách từ two, và list.append() để thêm giá trị duy nhất từ ​​three.

Trong trường hợp bạn đã đi sai:

  • nỗ lực đầu tiên của bạn tạo ra một danh sách mới với các giá trị từ one, twothree lồng bên trong chứ không phải là concatenating danh sách hiện có. Nỗ lực của bạn để làm sạch mà chỉ cần sao chép các danh sách lồng nhau trên.

  • Lần thử thứ hai của bạn không hoạt động vì giá trị trong three không phải là danh sách để không thể ghép nối được. Tôi đã tạo một danh sách mới chỉ cho một giá trị đó.

  • nỗ lực cuối cùng của bạn không nên đã sử dụng list.append() trong một biểu thức máy phát điện, bởi vì bạn lưu trữ các giá trị trở của phương pháp đó, mà luôn luôn là None (thay đổi của nó được lưu trữ trong v trực tiếp và danh sách không cần trở về lần nữa).

Demo của cách tiếp cận thứ nhất:

>>> one={'a': [1, 2], 'c': [5, 6], 'b': [3, 4]} 
>>> two={'a': [2.4, 3.4], 'c': [5.6, 7.6], 'b': [3.5, 4.5]} 
>>> three={'a': 1.2, 'c': 3.4, 'b': 2.3} 
>>> {key: value + two[key] + [three[key]] for key, value in one.iteritems()} 
{'a': [1, 2, 2.4, 3.4, 1.2], 'c': [5, 6, 5.6, 7.6, 3.4], 'b': [3, 4, 3.5, 4.5, 2.3]} 
+0

Cảm ơn bạn rất nhiều! Nó hoạt động hoàn hảo tất nhiên! Cảm ơn đôi vì lời giải thích, rất hữu ích! – branwen85

+0

Tôi đang làm việc trên một vấn đề tương tự và điều này là * rất * hữu ích. –

0

Xem trợ giúp này hay không:

>>> dic={} 
>>> k=[] 
>>> for i in 'abc': 
    k=one[i]+two[i] 
    k.append(three[i]) 
    dic[i]=k 


>>> dic 
{'c': [5, 6, 5.6, 7.6, 3.4], 'a': [1, 2, 2.4, 3.4, 1.2], 'b': [3, 4, 3.5, 4.5, 2.3]} 
Các vấn đề liên quan