3

辞書のリストのリスト:

 A = [
       [{'x': 1, 'y': 0}, {'x': 2, 'y': 3}, {'x': 3, 'y': 4}, {'x': 4, 'y': 7}],

       [{'x': 1, 'y': 0}, {'x': 2, 'y': 2}, {'x': 3, 'y': 13}, {'x': 4, 'y': 0}],

       [{'x': 1, 'y': 20}, {'x': 2, 'y': 4}, {'x': 3, 'y': 0}, {'x': 4, 'y': 8}]

     ]

辞書の各リストから最大の「y」値を取得する必要があるため、結果のリストには次のものが含まれます。

 Z = [(4, 7), (3,13), (1,20)]

A では、「x」は各辞書のキーであり、「y」は各辞書の値です。

何か案は?ありがとうございました。

4

5 に答える 5

6

maxkeyオプションのパラメーターを受け入れます。

A = [
    [{'x': 1, 'y': 0}, {'x': 2, 'y': 3}, {'x': 3, 'y': 4}, {'x': 4, 'y': 7}],
    [{'x': 1, 'y': 0}, {'x': 2, 'y': 2}, {'x': 3, 'y': 13}, {'x': 4, 'y': 0}],
    [{'x': 1, 'y': 20}, {'x': 2, 'y': 4}, {'x': 3, 'y': 0}, {'x': 4, 'y': 8}]
]

Z = []
for a in A:
    d = max(a, key=lambda d: d['y'])
    Z.append((d['x'], d['y']))
print Z

アップデート

提案者 – JF セバスチャン:

from operator import itemgetter
Z = [itemgetter(*'xy')(max(lst, key=itemgetter('y'))) for lst in A]
于 2013-06-21T03:04:34.947 に答える
5

私はitemgetterandmaxkey引数を使用します:

from operator import itemgetter

pair_getter = itemgetter('x', 'y')
[pair_getter(max(d, key=itemgetter('y'))) for d in A]
于 2013-06-21T03:11:15.560 に答える
4
[max(((d['x'], d['y']) for d in l), key=lambda t: t[1]) for l in A]
于 2013-06-21T03:03:29.497 に答える
2

あなたが述べた問題の解決策は示されましたが、基礎となるデータ構造を変更することをお勧めします。ポイントなどの小さな要素の場合、タプルははるかに高速です。必要に応じて使用することで、辞書の明快さを維持namedtupleできます。

>>> from collections import namedtuple
>>> A = [
       [{'x': 1, 'y': 0}, {'x': 2, 'y': 3}, {'x': 3, 'y': 4}, {'x': 4, 'y': 7}],

       [{'x': 1, 'y': 0}, {'x': 2, 'y': 2}, {'x': 3, 'y': 13}, {'x': 4, 'y': 0}],

       [{'x': 1, 'y': 20}, {'x': 2, 'y': 4}, {'x': 3, 'y': 0}, {'x': 4, 'y': 8}]

     ]

名前付きタプルのPoint作成は簡単です

>>> Point = namedtuple('Point', 'x y')

インスタンスはこんな感じ

>>> Point(x=1, y=0) # Point(1, 0) also works
Point(x=1, y=0)

A次に、このようになります

>>> A = [[Point(**y) for y in x] for x in A]
>>> A
[[Point(x=1, y=0), Point(x=2, y=3), Point(x=3, y=4), Point(x=4, y=7)], 
 [Point(x=1, y=0), Point(x=2, y=2), Point(x=3, y=13), Point(x=4, y=0)], 
 [Point(x=1, y=20), Point(x=2, y=4), Point(x=3, y=0), Point(x=4, y=8)]]

このように作業するのはずっと簡単です:

>>> from operator import attrgetter
>>> [max(row, key=attrgetter('y')) for row in A]
[Point(x=4, y=7), Point(x=3, y=13), Point(x=1, y=20)]

タプルの速度の利点を維持するには、インデックスでアクセスすることをお勧めします。

>>> from operator import itemgetter
>>> [max(row, key=itemgetter(2)) for row in A]
[Point(x=4, y=7), Point(x=3, y=13), Point(x=1, y=20)]
于 2013-06-21T05:07:44.640 に答える