2009-01-12 48 views
5

Với hai bộ từ điển, d1d2, và một số nguyên l, tôi muốn tìm tất cả các phím k trong d1 như vậy mà một trong hai d2[k]<l hoặc k not in l. Tôi muốn đầu ra các phím và các giá trị tương ứng trong d2, ngoại trừ nếu d2 không chứa chìa khóa, tôi muốn in 0. Ví dụ, nếu d1điển So sánh bằng Python

a: 1 
b: 1 
c: 1 
d: 1 

d2

a: 90 
b: 89 
x: 45 
d: 90 

l là 90, đầu ra sẽ là (có thể theo thứ tự khác)

b 89 
c 0 

W mũ là cách tốt nhất để làm điều này trong Python? Tôi chỉ mới bắt đầu học ngôn ngữ, và cho đến nay đây là những gì tôi có:

for k in d1.keys(): 
    if k not in d2: 
     print k, 0 
    else: 
     if d2[k]<l: 
      print k, d2[k] 

này hoạt động của khóa học (trừ khi tôi có một lỗi đánh máy), nhưng có vẻ như với tôi rằng sẽ có một cách pythonic hơn làm việc đó.

+0

Trong đoạn đầu tiên bạn có nghĩa là "k not in d2" thay vì "k not in l"? –

Trả lời

4

Bạn có thể đơn giản hóa điều này bằng cách sử dụng defaultdict. Gọi __getitem__ trên defaultdict sẽ trả về giá trị "mặc định".

from collections import defaultdict 
d = defaultdict(int) 
print d['this key does not exist'] # will print 0 

Một chút mà bạn có thể thay đổi không phải là để gọi các phím. Từ điển triển khai lặp. Nó sẽ là thích hợp hơn để chỉ cần viết:

for k in d1: 
10

Yours là thực sự tốt - bạn có thể đơn giản hóa nó để

for k in d1: 
    if d2.get(k, 0) < l: 
     print k, d2.get(k, 0) 

đó là (với tôi) pythonic, và khá nhiều "dịch" trực tiếp vào mã mô tả của bạn.

Nếu bạn muốn tránh những tra cứu đôi, bạn có thể làm

for k in d1: 
    val = d2.get(k, 0) 
    if val < l: 
     print k, val 
2

Đây là một phiên bản nhỏ gọn, nhưng bạn là hoàn toàn OK:

from collections import defaultdict 

d1 = {'a': 1, 'b': 1, 'c': 1, 'd': 1} 
d2 = {'a': 90, 'b': 89, 'x': 45, 'd': 90} 
l = 90 

# The default (==0) is a substitute for the condition "not in d2" 
# As daniel suggested, it would be better if d2 itself was a defaultdict 
d3 = defaultdict(int, d2) 
print [ (k, d3[k]) for k in d1 if d3[k] < l ] 

Output:

[('c', 0), ('b', 89)] 
+0

Đây thực sự là +1 cho daniel –

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