python地将python中的单个有序列表转换为字典

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的一部分! - ).

  • +1"for trick"和你对`iterutils.py`的评论. (2认同)

Ste*_*202 9

LukášLalinský的回答相同,不同的成语:

>>> dict(zip(*([iter(t)] * 2)))
{'a': 2, 'c': 4, 'b': 3}
Run Code Online (Sandbox Code Playgroud)

这里使用了dict,zipiter功能.它优于Lukáš的答案是它适用于任何可迭代的.这个怎么运作:

  1. iter(t)在列表上创建一个迭代器t.
  2. [iter(t)] * 2 创建一个包含两个元素的列表,它引用相同的迭代器.
  3. zip 是一个函数,它接受两个可迭代对象并将它们的元素配对:第一个元素在一起,第二个元素在一起,等等,直到一个可迭代用尽.
  4. zip(*([iter(t)] * 2))导致相同的迭代器结果t作为两个参数传递给zip.zip因此将采用第一和第二元素t并将它们配对.然后是第三和第四.然后是第五和第六等
  5. dict采用包含(key, value)对的迭代,并从中创建一个dctionary.
  6. dict(zip(*([iter(t)] * 2))) 根据OP的要求创建字典.


Luk*_*ský 7

不完全有效,但如果你不需要非常大的列表:

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)


Ste*_*osh 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}
Run Code Online (Sandbox Code Playgroud)

它可能看起来不漂亮,但它不会产生不必要的内存副本.