這裏的原始列表:生成列表詞典在Python
['name', 'value', 'name', 'value', 'name', 'value']
等。我需要提取名稱/值對字典:
{'name': 'value', 'name': 'value', 'name': 'value'}
有人可以詳細說明最簡單的方法來做到這一點嗎?
這裏的原始列表:生成列表詞典在Python
['name', 'value', 'name', 'value', 'name', 'value']
等。我需要提取名稱/值對字典:
{'name': 'value', 'name': 'value', 'name': 'value'}
有人可以詳細說明最簡單的方法來做到這一點嗎?
如果L
是您的原始列表,您可以使用zip(*[iter(L)]*2)
將這些項目組合成對。該dict constructor可以採取對這樣的迭代直接
>>> L = ['name1', 'value1', 'name2', 'value2', 'name3', 'value3']
>>> dict(zip(*[iter(L)]*2))
{'name1': 'value1', 'name2': 'value2', 'name3': 'value3'}
我不知道你的簡單的意思(簡單理解?)。很難猜出你認爲更簡單,因爲我不知道你處於什麼級別。這是一種不使用iter
或zip
的方法。如果你不知道enumerate
還有什麼,你應該查找它。
>>> d = {}
>>> for i, item in enumerate(L):
... if i % 2 == 0:
... key = item
... else:
... d[key] = item
...
>>> d
{'name1': 'value1', 'name2': 'value2', 'name3': 'value3'}
你可以試試這個
>>> a = ['a', 'b', 'c', 'd', 'e', 'f']
>>> dict(zip([x for x in a[::2]], [x for x in a[1::2]]))
{'a': 'b', 'c': 'd', 'e': 'f'}
a[::2]
將得到清單開始所有第二個元素從0th
元素。
a[1::2]
將從列表中獲取第二個元素從1st
元素開始。
不要帶走任何人。我想這可能是有點更容易理解:
dict (zip (L[::2] , L[1::2]))
雖然這是一個大名單比gnibbler的回答效率較低。
您需要一個將序列分組爲固定長度塊的功能。不幸的是,這在Python內核中是缺乏的。您可以使用funcy庫中的partition
。 (注意:在其他語言中,這稱爲chunksOf或grouped)。
的itertools文檔建議此功能:
from itertools import zip_longest
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
而且zip文檔建議一個不同的方式來完成同樣的事情(在gnibbler's answer給出):
def grouper(iterable, n):
return zip(*[iter(iterable)]*n)
一旦這可用,其餘的工作是微不足道的。
>>> dict(grouper(range(8), 2))
{0: 1, 2: 3, 4: 5, 6: 7}
謝謝。如果知道有多少個鍵/值對,會更簡單嗎? – 2014-10-28 04:02:52
@JoshuaGilman,知道長度並沒有什麼幫助。我爲我的回答添加了另一種(長時間)的方式。他們是那種類型的東西嗎? – 2014-10-28 04:28:24
這是不是依賴於zip的內部實現?即它試圖從每個迭代器中一次讀取一個項目,而不是急切地獲取第一個和第二個列表? – Maxaon3000 2014-10-28 04:36:41