在Python中从列表生成字典

时间:2014-10-28 03:27:58

标签: python list dictionary

这是原始列​​表:

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

等等。我需要将名称/值对提取到字典中:

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

有人可以详细说明最简单的方法吗?

4 个答案:

答案 0 :(得分:5)

如果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'}

我不确定你的意思是什么更简单(更容易理解?)。很难猜测你认为更简单,因为我不知道你在哪个级别。这是一种不使用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'}

答案 1 :(得分:1)

不要带走任何人。我认为这可能更容易理解:

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

虽然这对于大型列表来说效率低于gnibbler的答案。

答案 2 :(得分:1)

您需要一个函数将序列分组为固定长度的块。不幸的是,Python核心缺乏这一点。您可以使用funcy库中的partition。 (旁注:在其他语言中,这称为chunksOfgrouped)。

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}

答案 3 :(得分:0)

你可以试试这个

>>> 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元素开始从列表中获取所有第二个元素。