列表中对的词典列表

时间:2013-05-16 23:15:00

标签: python list dictionary

寻找一种将坐标列表转换为字典对的方法,即:

l = [1, 2, 3, 4, 5, 6, 7, 8]

我想创建一个词典列表:

output = [{'x': 1, 'y': 2}, {'x': 3, 'y': 4}, ... ]

关于如何“诡异地”这样做的任何想法?

5 个答案:

答案 0 :(得分:10)

典型的方法是使用"grouper"食谱:

from itertools import izip
def grouper(iterable,n):
    return izip(*[iter(iterable)]*n)

output = [{'x':a,'y':b} for a,b in grouper(l,2)]

这里的优点是它可以与任何可迭代的一起使用。迭代不需要是可索引的或类似的......

答案 1 :(得分:6)

output = [{'x': l[i], 'y': l[i+1]} for i in range(0, len(l), 2)]

或者:

output = [{'x': x, 'y': y} for x, y in zip(*[iter(l)]*2)]

这种从列表中对项目进行分组的方法直接来自zip() documentation

答案 2 :(得分:4)

你可以这样做:

>>> mylist = [1,2,3,4,5,6,7,8]
>>> [{'x': x, 'y': y} for x, y in zip(mylist[::2], mylist[1::2])]
[{'y': 2, 'x': 1}, {'y': 4, 'x': 3}, {'y': 6, 'x': 5}, {'y': 8, 'x': 7}]

请注意,词典是无序的,因此{'y': 2, 'x': 1}{'x': 1, 'y': 2}相同。这使用了Python的内置zip()函数。

答案 3 :(得分:2)

这是另一种方式

>>> from itertools import izip
>>> l = [1, 2, 3, 4, 5, 6, 7, 8]
>>> l = iter(l)
>>> [dict(x=x, y=y) for (x, y) in izip(l, l)]                                   
[{'y': 2, 'x': 1}, {'y': 4, 'x': 3}, {'y': 6, 'x': 5}, {'y': 8, 'x': 7}]

或者,正如Lattyware建议的那样

 >>> [{'x':x, 'y':y} for (x, y) in izip(l, l)]
 [{'y': 2, 'x': 1}, {'y': 4, 'x': 3}, {'y': 6, 'x': 5}, {'y': 8, 'x': 7}]

答案 4 :(得分:2)

我相信namedtuple比字典更适合这项工作。 (使用像@mgilson这样的itertools grouper食谱)

>>> from collections import namedtuple
>>> from itertools import izip
>>> Point = namedtuple('Point', ('x', 'y'))
>>> def grouper(iterable,n):
        return izip(*[iter(iterable)]*n)

>>> nums = [1, 2, 3, 4, 5, 6, 7, 8]
>>> [Point(x, y) for x, y in grouper(nums, 2)]
[Point(x=1, y=2), Point(x=3, y=4), Point(x=5, y=6), Point(x=7, y=8)]