2012-08-07 44 views
8

Tôi có hai từ điển có cùng khóa và tôi muốn chia nhỏ các giá trị để cập nhật hoặc tạo một từ điển mới, giữ nguyên các phím, với thương như là giá trị mới cho mỗi phím.Chia các giá trị của hai từ điển trong python

d1 = { 'a':12 , 'b':10 , 'c':2 } 
d2 = { 'a':0 , 'c':2 , 'b':5} 
d3 = d2/d1 

d3 = { 'a':0 , 'b':0.5 , 'c':1 } 

Ngoài iterating qua chìa khóa, cặp giá trị và tạo danh sách có thứ tự các giá trị, sau đó chia cho, tôi không chắc chắn làm thế nào để làm điều này. Tôi đã hy vọng cho một giải pháp thanh lịch hơn.

Trả lời

13

Sử dụng viewkeys (python2.7):

{k: float(d2[k])/d1[k] for k in d1.viewkeys() & d2} 

Cùng trong python 3 (nơi chúng tôi có thể thả float() cuộc gọi hoàn toàn):

{k: d2[k]/d1[k] for k in d1.keys() & d2} 

Vâng, tôi đang sử dụng một giao điểm mấu chốt ở đây ; nếu bạn là hoàn toàn chắc chắn phím của bạn đều giống nhau trong cả hai, chỉ cần sử dụng d2:

{k: float(d2[k])/d1[k] for k in d2} 

Và để được hoàn thành, Trong Python 2.6 và trước khi bạn sẽ phải sử dụng một constructor dict() với một biểu thức máy phát điện để đạt được giống:

dict((k, float(d2[k])/d1[k]) for k in d2) 

tạo chuỗi các giá trị khóa.

+0

giao điểm chính là không cần thiết, OP cho biết 2 dấu gạch có cùng các phím – jamylak

+0

@jamylak: an toàn hơn xin lỗi? :-P –

+0

@MartijinPieters bạn là chính xác! – jamylak

5

này làm việc cho tất cả các con trăn, tôi sẽ khuyên tuy nhiên giải pháp bởi @MartijnPieters nếu có Py 2.7+

>>> d1 = { 'a':12 , 'b':10 , 'c':2 } 
>>> d2 = { 'a':0 , 'c':2 , 'b':5} 
>>> d3 = dict((k, float(d2[k])/d1[k]) for k in d2) 
>>> d3 
{'a': 0.0, 'c': 1.0, 'b': 0.5} 
4
d1 = { 'a':12 , 'b':10 , 'c':2 } 
d2 = { 'a':0 , 'c':2 , 'b':5} 
d3={x:float(d2[x])/d1[x] for x in d1} 
print d3 

đầu ra:

{'a': 0.0, 'c': 1.0, 'b': 0.5} 
+0

+1 Không bao giờ biết nó hoạt động cho người dicts quá! – SuperSaiyan

+2

@Thrustmaster: nó được gọi là đọc hiểu dict; được giới thiệu trong python 2.7: [PEP 274] (http://www.python.org/dev/peps/pep-0274/). –

+0

@MartijnPieters: Amazing! Cảm ơn :) – SuperSaiyan

1

trong 3.2 bạn sử dụng. phương thức keys() và .get (key). http://www.tutorialspoint.com/python/python_dictionary.htm

+0

'.get (key)' trả về None nếu khóa không được xác định. Mặc dù nó sẽ luôn luôn là nếu bạn lặp qua '.keys()', điều này có nghĩa là '.get (key)' là chậm hơn so với chỉ truy cập mục đơn giản ('d1 [key]'). –

+0

Điều đó cũng hoạt động trong Python 2 – jamylak

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