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