在Python中从列表生成字典

3

这是原始列表:

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

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

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

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

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

谢谢。如果已知有多少个键/值对,会不会简单一些? - Joshua Gilman
@JoshuaGilman,知道长度并没有什么帮助。我在我的答案中添加了另一种(冗长的)方法。这是你想要的类型吗? - John La Rooy
这不是依赖于zip的内部实现吗?即它尝试从每个迭代器逐个读取一个项目,而不是急切地获取第一个和第二个列表吗? - Maxaon3000
@Maxaon3000,当然可以。这是文档化的行为 - John La Rooy
你说得对,这个具体的模式确实在文档中有提到。你可能应该在你的回答中添加链接。已点赞。 - Maxaon3000

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

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

一旦这个可用,其余的工作就变得微不足道了。
>>> dict(grouper(range(8), 2))
{0: 1, 2: 3, 4: 5, 6: 7}

1

不是贬低任何人,我认为这可能更容易理解:

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

尽管这种方法对于较大的列表不如gnibbler的答案高效。

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] 将获取从列表的 0 索引开始的所有第二个元素。

a[1::2] 将获取从列表的 1 索引开始的所有第二个元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接