2012-02-25 20 views
49

Trong python2.7 + tồn tại cách nào để làm một cái gì đó như:Làm thế nào để sử dụng if/else trong một từ điển hiểu?

{ something_if_true if condition else something_if_false for key, value in dict_.items() } 

Tôi biết bạn có thể làm bất cứ điều gì chỉ với 'nếu'

{ something_if_true for key, value in dict_.items() if condition} 
+2

như đã nói bởi @Marcin, một 'dict' được tạo thành từ các phần tử' key: value', bạn không xây dựng một 'dict' ở đây nhưng là một' bộ' (xem [set literals] (http: // docs) .python.org/dev/whatsnew/2.7.html # ngôn ngữ khác thay đổi)). – MatToufoutu

Trả lời

102

Bạn đã nhận nó: A if test else B là một biểu thức python hợp lệ. Vấn đề duy nhất với sự hiểu biết dict của bạn như là nơi dành cho một biểu hiện trong một sự hiểu biết dict phải có hai biểu thức, cách nhau bằng dấu hai chấm:

{ (some_key if condition else default_key):(something_if_true if condition 
      else something_if_false) for key, value in dict_.items() } 

các if khoản chính thức hoạt động như một bộ lọc, đó là khác biệt so với có biểu thức điều kiện.

+5

Đáng nói rằng bạn không cần phải có điều kiện if-else cho cả khóa và giá trị. Ví dụ, '{(a if condition else b): giá trị cho khóa, giá trị trong dict.items()}' sẽ hoạt động. –

+1

@ JeremyWeirich Bạn không cần phải có một người nào khác nếu họ không muốn. – Marcin

1

@Marcin's answer bao gồm tất cả, nhưng chỉ trong trường hợp ai đó muốn xem một ví dụ thực tế, tôi thêm hai dưới đây:

Hãy nói rằng bạn có từ điển sau đây của bộ

d = {'key1': {'a', 'b', 'c'}, 'key2': {'foo', 'bar'}, 'key3': {'so', 'sad'}} 

và bạn muốn tạo từ điển mới có khóa cho biết chuỗi 'a' có được chứa trong giá trị hay không, bạn có thể sử dụng

dout = {"a_in_values_of_{}".format(k) if 'a' in v else "a_not_in_values_of_{}".format(k): v for k, v in d.items()} 

trong đó sản lượng

{'a_in_values_of_key1': {'a', 'b', 'c'}, 
'a_not_in_values_of_key2': {'bar', 'foo'}, 
'a_not_in_values_of_key3': {'sad', 'so'}} 

Bây giờ chúng ta hãy giả sử bạn có hai bộ từ điển như thế này

d1 = {'bad_key1': {'a', 'b', 'c'}, 'bad_key2': {'foo', 'bar'}, 'bad_key3': {'so', 'sad'}} 
d2 = {'good_key1': {'foo', 'bar', 'xyz'}, 'good_key2': {'a', 'b', 'c'}} 

và bạn muốn thay thế các phím trong d1 bởi các phím của d2 nếu có giá trị tương ứng là giống hệt nhau, bạn có thể làm

# here we assume that the values in d2 are unique 
dout2 = {d2.keys()[d2.values().index(v1)] if v1 in d2.values() else k1: v1 for k1, v1 in d1.items()} 

mang đến cho

{'bad_key2': {'bar', 'foo'}, 
'bad_key3': {'sad', 'so'}, 
'good_key2': {'a', 'b', 'c'}} 
Các vấn đề liên quan