簡體   English   中英

在Python中從列表生成字典

[英]Generate dictionary from list in Python

這是原始列​​表:

['name', 'value', 'name', 'value', 'name', 'value']

等等。 我需要將名稱/值對提取到字典中:

{'name': 'value', 'name': 'value', 'name': 'value'}

有人可以詳細說明最簡單的方法嗎?

如果L是您的原始列表,您可以使用zip(*[iter(L)]*2)將項目分組。 dict構造函數可以直接使用這些對的迭代

>>> L = ['name1', 'value1', 'name2', 'value2', 'name3', 'value3']
>>> dict(zip(*[iter(L)]*2))
{'name1': 'value1', 'name2': 'value2', 'name3': 'value3'}

我不確定你的意思是什么更簡單(更容易理解?)。 很難猜測你認為更簡單,因為我不知道你在什么級別。 這是一種不使用iterzip 如果你還不知道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'}

不要帶走任何人。 我認為這可能更容易理解:

dict (zip (L[::2] , L[1::2] ))

雖然這對於大型列表來說效率低於gnibbler的答案。

您需要一個函數將序列分組為固定長度的塊。 不幸的是,Python核心缺乏這一點。 您可以使用funcy庫中的partition (旁注:在其他語言中,這稱為chunksOf分組 )。

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的答案中給出):

def grouper(iterable, n):
    return zip(*[iter(iterable)]*n)

一旦可用,其余的工作都是微不足道的。

>>> dict(grouper(range(8), 2))
{0: 1, 2: 3, 4: 5, 6: 7}

你可以試試這個

>>> 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元素開始從列表中獲取所有第二個元素。

暫無
暫無

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

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