我有一个类似于以下的值列表:
["a", 1, "b", 2, "c", 3]
我想从中构建这样一个字典:
{"a": 1, "b": 2, "c": 3}
在Python中自然的方式是什么?
我有一个类似于以下的值列表:
["a", 1, "b", 2, "c", 3]
我想从中构建这样一个字典:
{"a": 1, "b": 2, "c": 3}
在Python中自然的方式是什么?
>>> x = ["a", 1, "b", 2, "c", 3]
>>> i = iter(x)
>>> dict(zip(i, i))
{'a': 1, 'c': 3, 'b': 2}
iter
函数以将列表分为两部分。请参阅 http://docs.python.org/library/itertools.html#itertools.izip 中的惯用法。 - Josh Leedict(zip(*[iter(x)]*2))
- Rik Poggi.next()
时,它只会返回列表的下一个值。我编写了一个仅适用于两个参数的zip的简单实现:http://codepad.org/ywXjojYM尝试在脑海中将左右两侧替换为i
,或者在每个步骤之间添加“print”来运行代码。 - André Paramés这看起来相当简洁,但我不会说它很自然:
>>> l = ["a", 1, "b", 2, "c", 3]
>>> dict(zip(l[::2], l[1::2]))
{'a': 1, 'c': 3, 'b': 2}
zip
。>>> lst = ["a", 1, "b", 2, "c", 3]
>>> dict(zip(lst[::2], lst[1::2])
{'a': 1, 'c': 3, 'b': 2}
另一种方式:
>>> l = ["a", 1, "b", 2, "c", 3]
>>> dict([l[i:i+2] for i in range(0,len(l),2)])
{'a': 1, 'c': 3, 'b': 2}
我并不认为有很多情况会遇到这个确切的问题,因此没有“自然”的解决方案。但是,一个快速的一行代码应该可以解决你的问题:
{input_list[2*i]:input_list[2*i+1] for i in range(len(input_list)//2)}
input
)作为变量名。在Python 2.7中,它在for循环上失败,在Python 3中,它会抱怨range的参数是浮点数。 - Nobody moving away from SE//
的修正方法。这次讨论再次证明了我们在提供Python代码时应该始终给出版本号的重要性。 - Nobody moving away from SE