2012-04-30 35 views
8

Người ta có thể tạo các từ điển sử dụng máy phát điện (PEP-289):Làm cách nào để thêm cặp khóa-giá trị bổ sung vào dict() được tạo bằng đối số trình tạo?

dict((h,h*2) for h in range(5)) 
#{0: 0, 1: 2, 2: 4, 3: 6, 4: 8} 

Có cú pháp có thể để thêm một số cặp khóa-giá trị trong dict cùng() gọi? Cú pháp sau đây là sai nhưng tốt hơn giải thích câu hỏi của tôi:

dict((h,h*2) for h in range(5), {'foo':'bar'}) 
#SyntaxError: Generator expression must be parenthesized if not sole argument 

Nói cách khác, là nó có thể để xây dựng sau đây trong một dict đơn() gọi:

{0: 0, 1: 2, 2: 4, 3: 6, 4: 8, 'foo': 'bar' } 

Trả lời

16

vị thi công:

dict(iterableOfKeyValuePairs, **dictOfKeyValuePairs) 

Ví dụ:

>>> dict(((h,h*2) for h in range(5)), foo='foo', **{'bar':'bar'}) 
{0: 0, 1: 2, 2: 4, 3: 6, 4: 8, 'foo': 'foo', 'bar': 'bar'} 

(Lưu ý rằng bạn sẽ cần phải nghĩ giải lao biểu thức máy phát điện nếu không phải là đại diện duy nhất.)

+1

+1, toàn diện nhưng ngắn gọn. Làm tốt. –

+1

+1, Đây là những người bạn * arg ** kwargs của chúng tôi một lần nữa – Boud

+0

Đó là nó! Cảm ơn nhiều! – tnajdek

0

Bạn có thể sử dụng itertools.chain (xem Concatenate generator and item) để thêm nội dung bổ sung vào cuộc gọi của bạn tới dict().

Có thể rõ ràng hơn để làm điều đó một cách dễ dàng, mặc dù: một cuộc gọi đến dict và sau đó thêm các mục bổ sung một cách rõ ràng.

1
dict([(h,h*2) for h in range(5)] + [(h,h2) for h,h2 in {'foo':'bar'}.items()]) 
Các vấn đề liên quan