2014-10-28 64 views
3

这里的原始列表:生成列表词典在Python

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

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

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

有人可以详细说明最简单的方法来做到这一点吗?

回答

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'} 
+0

谢谢。如果知道有多少个键/值对,会更简单吗? – 2014-10-28 04:02:52

+0

@JoshuaGilman,知道长度并没有什么帮助。我为我的回答添加了另一种(长时间)的方式。他们是那种类型的东西吗? – 2014-10-28 04:28:24

+0

这是不是依赖于zip的内部实现?即它试图从每个迭代器中一次读取一个项目,而不是急切地获取第一个和第二个列表? – Maxaon3000 2014-10-28 04:36:41

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元素开始。

1

不要带走任何人。我想这可能是有点更容易理解:

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

虽然这是一个大名单比gnibbler的回答效率较低。

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}