2012-11-13 34 views
9

tôi cố gắng tổng hợp hai bộ từ điển như thế:Lỗi Loại: không được hỗ trợ loại toán hạng (s) cho +: 'dict_items' và 'dict_items'

my_new_dict = dict(my_existing_dict.items() + my_new_dict.items()) 

nhưng Nhận các lỗi

TypeError: unsupported operand type(s) for +: 'dict_items' and 'dict_items' 

Những gì tôi làm sai rồi?

+0

Sidenote: Nếu bạn muốn lặp lại hai từ điển và bạn biết chúng có khóa duy nhất (hoặc không quan trọng nếu bạn xử lý cùng một khóa hai lần), hãy xem xét sử dụng itertools.chain (dict_a, dict_b) – Moberg

Trả lời

20

Trong python3, dict.items() trả về một đối tượng với kiểu dict_items mà dường như không thể được thêm vào. (trong python 2, nó trả lại một list có thể được thêm vào).

Một cách khác để thêm một cặp điển mà hoạt động trên py2k và py3k:

d = dict1.copy() 
d.update(dict2) 

Tất nhiên, có một số sự mơ hồ về những gì bạn muốn xảy ra trong trường hợp va chạm then chốt. ví dụ. nếu cả hai dicts có key1, có key1 nên được giữ nguyên ở đầu ra không? Hoặc bạn nên sử dụng một số kết hợp cả hai giá trị của chúng? Trong trường hợp thứ hai, có thể bạn sẽ muốn thứ gì đó từ mô-đun collections (hoặc defaultdict hoặc Counter)

+0

cảm ơn, nó hoạt động! Tôi ghét 2,7> 3,2 di cư ... – JohnDow

+1

@ VladislavIl'ushin: bạn ** thực sự ** nên đọc tài liệu. – SilentGhost

+0

@mgilson: Tôi nghĩ rằng 'dict.items()' trong 3+ tương đương với 'dict.iteritems()' trong 2.6, nghĩa là, nó là một trình lặp. –

17

Vấn đề đầu tiên là điều này không rõ ràng - từ điển không thể có khóa trùng lặp, vì vậy không rõ ý bạn là gì, điều gì sẽ xảy ra nếu cả hai đều chứa cùng một khóa?

Vấn đề chính ở đây, tuy nhiên, là dictionary views are set-like, vì vậy chúng không được triển khai bổ sung.

Điều bạn có thể muốn là union: d1.items() | d2.items(), sẽ cung cấp cho bạn bộ bộ gồm (key, value). Nếu bạn sau đó vượt qua nó để dict() và có bản sao, giá trị cuối cùng sẽ là một trong những được sử dụng.

Vì vậy, trong ngắn hạn:

dict(d1.items() | d2.items()) 
+5

Khi tôi thử điều này tôi nhận được: 'TypeError: unhashable type: 'dict'' –

+0

lifesaver! lừa đẹp, bạn của tôi! –

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