53

私はaxとayパラメータ(そして他のいくつかのもの)を持つオブジェクトのこのリストを持っています。

path.nodes = (
    <GSNode x=535.0 y=0.0 GSLINE GSSHARP>,
    <GSNode x=634.0 y=0.0 GSLINE GSSHARP>,
    <GSNode x=377.0 y=706.0 GSLINE GSSHARP>,
    <GSNode x=279.0 y=706.0 GSLINE GSSHARP>,
    <GSNode x=10.0 y=0.0 GSLINE GSSHARP>,
    <GSNode x=110.0 y=0.0 GSLINE GSSHARP>,
    <GSNode x=189.0 y=216.0 GSLINE GSSHARP>,
    <GSNode x=458.0 y=216.0 GSLINE GSSHARP>
)

このリストの最大yが必要です。しかし、私はこれを試しました:

print(max(path.nodes, key=y))

そして、私はこのエラーを受け取ります:

NameError: name 'y' is not defined

私はPythonに少し慣れていないので、ドキュメントには何の手がかりもありません。次のようなノードを反復処理する場合、キーワードが間違っていると思います。

for node in path.nodes:
    print(node.y)

yの値を取得します。誰かが私に説明をしてくれませんか?

4

7 に答える 7

92

オブジェクト全体ではなく最大値のみを取得するには、ジェネレータ式を使用できます。

print(max(node.y for node in path.nodes))
于 2012-10-25T11:32:29.730 に答える
33

このケースを支援するための組み込みがあります。

import operator

print(max(path.nodes, key=operator.attrgetter('y')))

または:

print(max(path.nodes, key=lambda item: item.y))

編集:しかし、マーク・バイアーズの答えは最もPythonicです。

print(max(node.y for node in path.nodes))
于 2012-10-25T11:31:20.090 に答える
27

「Pythonic」スタイル#1とラムダスタイル#2をいつ使用するかには重要な違いがあります。

max(node.y for node in path.nodes)  # (style #1)

max(path.nodes, key=lambda item: item.y)  # (style #2)

注意深く見ると、スタイル#1が属性の最大値を返し、yスタイル#2nodeが最大属性を持つを返すことがわかりますy。これら2つは同じではなく、属性値を反復処理したり、その属性を保持するオブジェクトを反復処理したりする場合は、コードの使用法が重要です。

例:

class node():
    def __init__(self,x):
        self.x = x
        self.y = self.x + 10

node_lst = [node(1), node(2), node(3), node(4), node(5)]
print([(e.x,e.y) for e in node_lst])

>>> [(1, 11), (2, 12), (3, 13), (4, 14), (5, 15)]

今:

maxy = max(node.y for node in node_lst)
print(maxy)
>>> 15

max_node = max(node_lst, key=lambda node: node.y)
print(max_node.y)
>>> 15
于 2017-10-17T17:46:50.223 に答える
5
from operator import attrgetter
print(max(path.nodes, key=attrgetter("y")))
于 2012-10-25T11:31:20.007 に答える
3

__gt__オブジェクトの比較演算子を実装してmax、キー関数なしで使用することもできます。

class node:
    def __init__(self, y):
        self.y = y
    def __gt__(self, other):
        return self.y > other.y

そして次のようなものより:

ls = [node(3), node(5), node(11), node(0)]
print(max(ls).y)

11を出力することになっています。

于 2019-11-29T19:38:00.693 に答える
0

y変数として定義されていません。これは個々のGSNodeオブジェクトの属性です。単独で名前として使用することはできません。

個々の属性にアクセスするには、モジュールのようkey=lambda x: x.yなものを使用できます。attrgetter()operator

于 2012-10-25T11:33:00.213 に答える
0

yがプロパティ属性の場合、をインポートする必要はありませんoperator.attrgetterfget代わりにメソッドを使用できます。

my_node = max(path.nodes, key=Node.y.fget)

これにより、最大値Nodeを取得する場所からインスタンスが返されます。ymy_node.y

于 2019-05-15T12:24:00.197 に答える