Riz*_*sim 1 python dictionary list python-itertools
我似乎无法找到一种优雅的方式从t开始并导致s.
>>>t = ['a',2,'b',3,'c',4]
#magic
>>>print s
{'a': 2, 'c': 4, 'b': 3}
Run Code Online (Sandbox Code Playgroud)
我提出的解决方案看起来不那么优雅:
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
Run Code Online (Sandbox Code Playgroud)
它显然很容易解决,但是,似乎还有更好的方法.在那儿?
Ale*_*lli 10
我会用itertools,但是,如果你认为这很复杂(正如你在评论中暗示的那样),那么可能:
def twobytwo(t):
it = iter(t)
for x in it:
yield x, next(it)
d = dict(twobytwo(t))
Run Code Online (Sandbox Code Playgroud)
或等效地,再次回到itertools,
def twobytwo(t):
a, b = itertools.tee(iter(t))
next(b)
return itertools.izip(a, b)
d = dict(twobytwo(t))
Run Code Online (Sandbox Code Playgroud)
或者,如果你坚持内联,在适合季节的"捣蛋"情绪:
d = dict((x, next(it)) for it in (iter(t),) for x in it)
Run Code Online (Sandbox Code Playgroud)
我,我认为这是一个技巧,但有些人可能会觉得这是一种享受.IOW,我发现这种事情很可怕,但显然在美国这个时代的这个时期应该是事情;-).
基本上,问题归结为"如何一次列出2个项目",因为dict很高兴采用一系列2元组并将其变成字典.我在这里展示的所有解决方案都确保只O(1)占用额外的空间(显然O(N),超出空间,输入列表和输出字典当然需要).
文档中建议的方法(每个人都应该熟悉那个页面,itertool配方)是pairwise该页面上的函数,这基本上是我在这里建议的第二个.我认为每个site-packages目录都应该包含一个iterutils.py带有这些配方的文件(可惜这样的文件不是python的stdlib的一部分! - ).
与LukášLalinský的回答相同,不同的成语:
>>> dict(zip(*([iter(t)] * 2)))
{'a': 2, 'c': 4, 'b': 3}
Run Code Online (Sandbox Code Playgroud)
这里使用了dict,zip和iter功能.它优于Lukáš的答案是它适用于任何可迭代的.这个怎么运作:
iter(t)在列表上创建一个迭代器t.[iter(t)] * 2 创建一个包含两个元素的列表,它引用相同的迭代器.zip 是一个函数,它接受两个可迭代对象并将它们的元素配对:第一个元素在一起,第二个元素在一起,等等,直到一个可迭代用尽.zip(*([iter(t)] * 2))导致相同的迭代器结果t作为两个参数传递给zip.zip因此将采用第一和第二元素t并将它们配对.然后是第三和第四.然后是第五和第六等dict采用包含(key, value)对的迭代,并从中创建一个dctionary.dict(zip(*([iter(t)] * 2))) 根据OP的要求创建字典.不完全有效,但如果你不需要非常大的列表:
dict(zip(t[::2], t[1::2]))
Run Code Online (Sandbox Code Playgroud)
或者使用生成器的版本:
dict(t[i:i+2] for i in xrange(0, len(t), 2))
Run Code Online (Sandbox Code Playgroud)
伙计们,伙计们,使用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}
Run Code Online (Sandbox Code Playgroud)
它可能看起来不漂亮,但它不会产生不必要的内存副本.