簡體   English   中英

這個字典理解的 for 循環是什么?

[英]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]}

雖然,如果不能保證KeyValue的長度相同,這可能會默默地失敗。 為避免這種情況,在 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.

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