2012-02-25 15 views
49

gibi bir şey yapmak için herhangi bir şekilde mevcuttur: A if test else B bir geçerli:Sözlük anlaşmasında/else kullanılıyorsa nasıl kullanılır? python2.7 olarak +

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

Ben Zaten bu var

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

, bir 'dict'' anahtar: değer 'elemanları yapılır, burada bir 'dict' değil, bir' set' oluşturuyorsunuz (bkz. [Set literals] (http: // docs) .python.org/dev/whatsnew/2.7.html # diğer dil-değişikliklerin)). – MatToufoutu

cevap

102

'' hemen hiçbir şeyi yapabilir biliyorum geçerli python ifadesi. gösterildiği gibi dict anlama sahip tek sorun dict anlama bir ifade için bir yer nokta ile ayrılmış bir iki ifade, sahip olmasıdır:

son if maddesi farklı olan bir filtre olarak hareket eder
{ (some_key if condition else default_key):(something_if_true if condition 
      else something_if_false) for key, value in dict_.items() } 

koşullu ifadeye sahip olmak.

Diyelim ki setleri

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

aşağıdaki sözlüğü var diyelim ve istiyorum:

+5

Hem anahtar hem de değer için bir if-else koşuluna sahip olmanız gerekmediğinden bahsetmeye değer. Örneğin, {(a eğer başka bir koşul b): anahtar için değer, dict.items()} 'deki değer çalışacaktır. –

+1

@JeremyWeirich Eğer istemiyorsanız, bunlardan biri için bir if-else'e sahip olmanıza gerek yoktur. – Marcin

1

@Marcin's answer hepsini kapsar, ancak her ihtimale karşı birisi bir gerçek örneğini görmek istiyor, ben iki altına ekleyin anahtarları dize 'a' değerlerinde veya olmasın bulunan belirtmek yeni sözlük oluşturmak kullanabilirsiniz

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()} 

Şimdi

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

Diyelim ki bu

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'}} 

gibi iki sözlükleri varsa ve ilgili değerleri aynı olup olmadığını, sen

yapabileceğini d2 anahtarları tarafından d1 anahtarlarını değiştirmek istiyor varsayalım verir ki

verir
# 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()} 

@Marcin tarafından anlatıldığı gibi

İlgili konular