簡體   English   中英

在理解中匹配字典關鍵元組項

[英]Matching dictionary key tuple items in a comprehension

當使用掃描字典的理解表達式時,如果我知道字典的鍵是簡單的2項元組,是否可以將它們“擴展”為命名變量?

例如,如果我有:

d = { ('car','blue') : 24,
      ('car',    'red'  ): 5,
      ('plant',     'green'): 12,
      ('box','blue' ): 3
}

我知道我能做到

[d[key] for key in d.keys() if key[1]=='blue']

得到

[24, 3]

但這失去了很多語義,我想知道我是否能以某種方式做更多的事情:

[count for {(object,color):count} in d if color=='blue']

(我知道這不起作用)。 另外我不明白為什么最后一個表達式返回的錯誤是:

SyntaxError: can't assign to literal

我會選擇:

[count for (object, color), count in d.items() if color == 'blue']

作為最明確的解決方案。

你得到的錯誤是因為當使用in關鍵字時python試圖將一個項目從d字典分配給{(object,color):count}這是一個文字意味着創建一個新的字典。 相反,使用(object, color), count因為這是python擴展dict項目的方式。

你不能那樣做,但如果你把你的鍵“升級”到命名元組 ,你可以接近。 我使用'kind'作為namedtuple中第一個項目的名稱,因為object是一個內置類型,雖然我們可以安全地在這里使用它,但我認為它會使代碼有點混亂。

from collections import namedtuple

d = { ('car', 'blue') : 24,
      ('car', 'red'): 5,
      ('plant', 'green'): 12,
      ('box', 'blue'): 3
}

Thing = namedtuple('Thing', ('kind', 'color'))
d = {Thing(*key): count for key, count in d.items()}
print(d)

lst = [count for key, count in d.items() if key.color == 'blue']
print(lst)
lst = [count for key, count in d.items() if key.kind == 'car']
print(lst)

產量

{Thing(kind='car', color='blue'): 24, Thing(kind='car', color='red'): 5, Thing(kind='plant', color='green'): 12, Thing(kind='box', color='blue'): 3}
[24, 3]
[24, 5]

實際上,你真的不需要命名元組,雖然我認為它們會讓它更好一點。 ;)

d = { ('car', 'blue') : 24,
      ('car', 'red'): 5,
      ('plant', 'green'): 12,
      ('box', 'blue'): 3
}

lst = [count for (kind, color), count in d.items() if color == 'blue']
print(lst)

有可能的。 嘗試:

  [d.get((object,color)) for object,color in d.keys() if color == 'blue']

這回來了

  [24, 3]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM