簡體   English   中英

python - 迭代字典列表和解包

[英]python - iterating list of dictionaries and unpacking

給出一個簡單的詞典列表

lst = [{'key1': 1}, {'key2': 2}, {'key3': 3}]

我想找到一個dict,它產生使用此處未詳述的方法評估的最小值。 我的第一個想法是迭代列表以通過dict檢查dict,但是這失敗了:

for k, v in [x.items() for x in lst]:
    print(k, v)

結果ValueError(以及使用生成器而不是列表):

for k, v in [x.items() for x in lst]:
ValueError: not enough values to unpack (expected 2, got 1)

然而,

for x in lst:
    for k, v in x.items():
        print(k, v)

產量

key1 1
key2 2
key3 3

正如所料。 我假設所有方法都按預期工作(除非PEBKAC),但為什么它不能使用列表理解? 有人可以開導我嗎?

編輯:我使用python 3,我知道items()產生一個dict_view,但我不明白為什么邏輯不起作用。

你錯過了一個迭代級別。

通常,dicts具有多個鍵/值對。 dict.items()將整個字典轉換為表單(key, value)的元組序列。 在你的情況下,每個字典只有一個項目,但items()的結果仍然是元組的元組。

如果[x.items() for x in lst]打印[x.items() for x in lst]的結果[x.items() for x in lst]您將看到結果是dict_view項目列表; 其中每一個都可以自己迭代。

您可以在列表理解中添加一級縮進(如@DanielRoseman建議的那樣),而不是使用dict_view的第一個元素:

for k, v in [(k, v) for x in lst for (k, v) in x.items()]:
  print(k, v)

key1 1
key2 2
key3 3

正如所料。

嘗試逐步解壓縮lst以了解它是如何構建的。

>>> in: lst[0].items()
>>> out: [('key1', 1)]

您的結果(等於列表x.items()表達式)是另一個包含k和v元組的列表 。元組是此列表中索引0的元素(也是唯一的元素) 。 所以你需要去

for k, v in [x.items()[0] for x in lst]:
    print(k, v)

您可以迭代字典的鍵值對,如下所示: -

for k, v in dic.items():
    print(k, v)

上面代碼的作用是首先將字典轉換為元組列表,然后在迭代到k時逐個解包,v就像:

k, v = (k, v) # Tuple unpacking.

現在,在您的情況下,請考慮以下代碼: -

z = [x.items() for x in lst]
print(z)

輸出是

[dict_items([('key1', 1)]), dict_items([('key2', 2)]), dict_items([('key3', 3)])] 

即元組列表的列表。

所以,讓我們將您的代碼重寫為: -

for k, v in z:
    print(k, v)

其中z是元組列表的列表。 在每次迭代中,它從父列表中獲取一個列表(其中只包含一個元素),然后嘗試: -

k, v = [(key, value)] # a list of only one tuple to be unpacked against two variables and hence the failure.

我希望這可以幫到你。

暫無
暫無

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

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