Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pythonic方法将字符串列表转换为字典,其中奇数索引字符串作为键,偶数索引字符串作为值?_Python_List Comprehension - Fatal编程技术网

Pythonic方法将字符串列表转换为字典,其中奇数索引字符串作为键,偶数索引字符串作为值?

Pythonic方法将字符串列表转换为字典,其中奇数索引字符串作为键,偶数索引字符串作为值?,python,list-comprehension,Python,List Comprehension,我有一个从某处解析的字符串列表,格式如下: [key1, value1, key2, value2, key3, value3, ...] 我想基于此列表创建一个字典,如下所示: {key1:value1, key2:value2, key3:value3, ...} 一个普通的带有索引偏移量的for循环可能会达到这个目的,但我想知道是否有一种类似python的方法可以做到这一点。列表理解似乎很有趣,但我似乎不知道如何将它们应用于这个特定的问题 有什么想法吗?你可以试试: dict(zip(

我有一个从某处解析的字符串列表,格式如下:

[key1, value1, key2, value2, key3, value3, ...]
我想基于此列表创建一个字典,如下所示:

{key1:value1, key2:value2, key3:value3, ...}
一个普通的带有索引偏移量的
for
循环可能会达到这个目的,但我想知道是否有一种类似python的方法可以做到这一点。列表理解似乎很有趣,但我似乎不知道如何将它们应用于这个特定的问题

有什么想法吗?

你可以试试:

dict(zip(l[::2], l[1::2]))
说明:我们从第一个或第二个元素(即
l[::2]
l[1::2]
)开始,分两步将列表分成两个列表,一个是偶数元素,一个是奇数元素。然后我们使用
zip
将两个列表内置到一个成对列表中。最后,我们调用
dict
,从这些键值对创建字典

这是时间上的
~4n
,空间上的
~4n
,包括最终的字典。不过,它可能比循环快,因为
zip
dict
和切片操作符都是用C编写的

result = dict(grouper(2, L))
grouper
是一个在列表中形成对的函数,如下所示:

dict
获取
(键、值)
对的列表并从中生成dict


您还可以编写
result=dict(zip(*[iter(L)]*2))
,让大多数读者感到困惑:-)

除了pavpanchekha的简短而完美的解决方案之外,您还可以使用生成器表达式(列表理解只是一个提供给列表构造函数的生成器表达式,它实际上更强大、更通用)为了获得额外的好处:

dict((l[i], l[l+1]) for i in range(0, len(l)-1, 2))

除了非常酷和实用之外,它还是一个更好的算法:除非dict的实现特别愚蠢(不太可能认为它是内置的),否则对于每一个大小的l(即,在恒定的O(1)空间中运行),这将消耗相同的内存量因为它一次只处理一对,而不是先创建一个全新的元组列表。

这是一个展示我最喜欢的python习惯用法的好机会:

>>> S = [1,2,3,4,5,6]
>>> dict(zip(*[iter(S)]*2))
{1: 2, 3: 4, 5: 6}
这个棘手的行将两个参数传递给
zip()
,其中每个参数都是S上的同一个迭代器。
zip()
创建两项元组,每次都从迭代器中提取
dict()
然后将这些元组转换为字典

推断:

S = [1,2,3,4,5,6]

I = iter(S)
dict(zip(I,I))

这正是我所需要的,并且解释得很好,非常感谢pavpanchekha
result=dict(zip(*[iter(L)]*2))
不保证有效(zip不保证参数的求值顺序)。你应该使用
result=dict(izip(*[iter(L)]*2))
作为一个清晰的模型(!)来保证正确的评估顺序。@Ducan:你从哪里得到这个(错误的)想法的?参见
izip
只是
zip
的迭代器版本。
>>> S = [1,2,3,4,5,6]
>>> dict(zip(*[iter(S)]*2))
{1: 2, 3: 4, 5: 6}
S = [1,2,3,4,5,6]

I = iter(S)
dict(zip(I,I))