3

座標のリストを辞書のペアに変換する方法を探しています。つまり、次の場合:

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

辞書のリストを作成したい:

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

これを「Python的に」行う方法についてのアイデアはありますか?

4

5 に答える 5

10

典型的な方法は、「ハタ」レシピを使用することです。

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)]

ここでの利点は、 iterable で動作することです。イテラブルはインデックス可能である必要はありません...

于 2013-05-16T23:18:13.943 に答える
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()リストから項目をグループ化するこの方法は、ドキュメントからそのまま引用されています。

于 2013-05-16T23:16:49.580 に答える
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()関数を利用します。

于 2013-05-16T23:18:05.153 に答える
2

namedtupleこの仕事には、辞書よりも のほうが適していると思います。( @mgilson のようなitertoolsハタのレシピを使用)

>>> 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)]
于 2013-05-17T01:26:54.090 に答える
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}]
于 2013-05-16T23:32:49.863 に答える