我似乎找不到从 t 开始的优雅方式,并导致 s 。
>>>t = ['a',2,'b',3,'c',4]
#magic
>>>print s
{'a': 2, 'c': 4, 'b': 3}
我提出的解决方案看起来不那么优雅:
s = dict()
for i in xrange(0, len(t),2): s[t[i]]=t[i+1]
# or something fancy with slices that I haven't figured out yet
它显然很容易解决,但是,似乎还有更好的方法。有吗?
答案 0 :(得分:10)
我会使用itertools
,但是,如果您认为这很复杂(正如您在评论中暗示的那样),那么可能:
def twobytwo(t):
it = iter(t)
for x in it:
yield x, next(it)
d = dict(twobytwo(t))
或等效,再次回到itertools,
def twobytwo(t):
a, b = itertools.tee(iter(t))
next(b)
return itertools.izip(a, b)
d = dict(twobytwo(t))
或者,如果你坚持内联,在适合季节的“捣蛋”心情:
d = dict((x, next(it)) for it in (iter(t),) for x in it)
我,我认为这是一个技巧,但有些人可能会觉得这是一种享受。 IOW,我发现这种事情很可怕,但显然在美国这个时候这个时候,事情是所谓的; - )。
基本上,问题归结为“如何一次列出2个项目列表”,因为dict
非常乐意采用一系列2元组并将其转换为字典。我在这里展示的所有解决方案都确保只有O(1)
额外的空间(超出空间,显然是O(N)
,这当然是输入列表和输出字典所需的。)
docs中建议的方法(每个人都应该熟悉那个页面,itertool配方)是该页面上的函数pairwise
,这基本上是我在这里建议的第二个。我认为每个site-packages目录都应该包含一个带有这些配方的iterutils.py
文件(可惜这样的文件不是python的stdlib的一部分! - )。
答案 1 :(得分:9)
与Lukáš Lalinský's answer相同的想法,不同的习语:
>>> dict(zip(*([iter(t)] * 2)))
{'a': 2, 'c': 4, 'b': 3}
这使用dict
,zip
和iter
函数。它优于Lukáš的答案是它适用于任何可迭代的。工作原理:
iter(t)
在列表t
上创建一个迭代器。[iter(t)] * 2
创建一个包含两个元素的列表,它引用相同的迭代器。zip
是一个函数,它接受两个可迭代对象并将它们的元素配对:第一个元素在一起,第二个元素在一起,等等,直到一个iterable耗尽。zip(*([iter(t)] * 2))
导致t
上的相同迭代器作为两个参数传递给zip
。因此,zip
将获取t
的第一个和第二个元素并将它们配对。然后是第三和第四。然后是第五和第六等。dict
使用包含(key, value)
对的迭代,并从中创建一个dctionary。dict(zip(*([iter(t)] * 2)))
根据OP的要求创建字典。答案 2 :(得分:7)
效率不高,但如果您不需要非常大的列表:
dict(zip(t[::2], t[1::2]))
或者使用生成器的版本:
dict(t[i:i+2] for i in xrange(0, len(t), 2))
答案 3 :(得分:6)
伙计们,伙计们,使用itertools。当列表变大时,你的低RAM用户会感谢你。
>>> from itertools import izip, islice
>>> t = ['a',2,'b',3,'c',4]
>>> s = dict(izip(islice(t, 0, None, 2), islice(t, 1, None, 2)))
>>> s
{'a': 2, 'c': 4, 'b': 3}
它可能看起来不漂亮,但它不会制作不必要的内存副本。
答案 4 :(得分:2)
使用stream模块:
>>> from stream import chop
>>> t = ['a',2,'b',3,'c',4]
>>> s = t >> chop(2) >> dict
>>> s
{'a': 2, 'c': 4, 'b': 3}
应该注意的是,这个模块相当模糊,并没有真正“按规则”播放通常被认为是政治上正确的Python。所以如果你只是学习Python,请不要走这条路;坚持标准库中的内容。
答案 5 :(得分:1)
dict(zip(t[::2], t[1::2]))
可能不是最有效的。适用于python 3;你可能需要在python 2.x
中导入zip