[英]What is the for loop for this dictionary comprehension?
我有以下 dict 理解,但我不知道如何將其轉換回 for 循環。
Value = [1,2,3,4,5]
Key = ['a','b','c','a','c']
{k: [Value[i] for i in [j for j, x in enumerate(Key) if x == k]] for k in set(Key)}
我試過:
d1 = {}
for k in set(Key):
for i in [j for j, x in enumerate(Key) if x == k]:
d1[k].append(Value[i])
但這顯然是錯誤的。 謝謝!
我不確定先前聲明的Value
是什么,但 dict 理解等效於:
d1 = {}
for k in set(Key):
d1[k] = []
for i in [j for j, x in enumerate(Key) if x == k]:
d1[k].append(Value[i])
您需要先將d1[k]
設置為空列表。
您只需要創建d1[k]
作為列表。
for k in set(Key):
d1[k] = []
...
雖然,內部列表理解是多余的:它真正做的只是將j
重命名為i
。 你也可以解開它:
for k in set(Key):
d1[k] = []
for i, x in enumerate(Key):
if x == k:
d1[k].append(Value[i])
也就是說,整個事情過於復雜,使用zip
可以更輕松地完成:
d1 = {}
for k, v in zip(Key, Value):
values = d1.setdefault(k, [])
values.append(v)
print(d1) # -> {'a': [1, 4], 'b': [2], 'c': [3, 5]}
雖然,如果不能保證Key
和Value
的長度相同,這可能會默默地失敗。 為避免這種情況,在 Python 3.10+ 中,您可以使用zip(Key, Value, strict=True)
,否則您可以將其修改為for i, k in enumerate(Key) ... values.append(Values[i])
.
注意:在 Python 3.7+ 中,由於set
轉換,此解決方案保留了您的插入順序。
考慮問題中的以下代碼:
{k: [Value[i] for i in [j for j, x in enumerate(Key) if x == k]] for k in set(Key)}
它可能是一個非常棒的單線,但它的作用對任何人來說都不是很明顯。 事實上,我花了一些時間來弄清楚它是如何工作的,但我仍然沒有完全理解它。
在這種情況下,我建議簡化它,也許將它分成幾行,這樣其他人和你自己更清楚發生了什么。 例如,考慮以下帶有defaultdict
示例,它是dict
的子類:
my_dict = defaultdict(list)
for k, v in zip(Key, Value):
my_dict[k].append(v)
my_dict
結果,再次包含相同的內容:
defaultdict(<class 'list'>, {'a': [1, 4], 'b': [2], 'c': [3, 5]})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.