15

Pythonのオブジェクトのリストがあり、それぞれにidプロパティがあります。それらのIDのリストを取得したい。

C#で書く

myObjects.Select(obj => obj.id);

Pythonでこれを行うにはどうすればよいですか?

4

5 に答える 5

20

ここで「リスト内包表記」のセクションを確認してください:http://docs.python.org/tutorial/datastructures.html

開始リストが呼び出されoriginal_list、新しいリストが呼び出されid_listた場合、次のようなことができます。

id_list = [x.id for x in original_list]
于 2010-11-23T22:11:33.293 に答える
14
[obj.id for obj in myObjects]
于 2010-11-23T22:11:57.707 に答える
7

それが大きなリストであり、IDを1回だけ処理する必要がある場合は、ジェネレーター式もあります。

ids = (obj.id for obj in my_objects)

for id in ids:
    do_something(id)

ジェネレータ式はランダムアクセスをサポートしていませんが、オンデマンドで各IDを取得するため、一度にリストを作成する必要はありません。ジェネレータ式はxrangeリスト内包表記と同じようになりrangeます。

ジェネレータ式に関するもう1つの注意点は、ジェネレータ式は、その中のリソースがまだ開いている間だけアクセスできるということです。たとえば、次のコードは失敗します。

with open(filename) as f:
    lines = (line for line in f)

# f is now closed
for line in lines:
    print line

この場合、同等のリスト内包表記が機能します。

于 2010-11-23T22:15:51.687 に答える
3

PythonでC#selectと直接同等のものが必要な場合は、サードパーティのライブラリを使用する代わりに、Pythonの反復可能オブジェクトに対してLINQ-for-objectsに触発された実装を提供するasqパッケージを使用できます。asqを使用すると、質問でC#コードは次のようになります。

from asq.initiators import query
query(myObjects).select(lambda obj: obj.id)

または、asqの別の機能と組み合わせる:

from asq.selectors import a_
query(myObjects).select(a_("id"))
于 2011-06-06T20:04:10.513 に答える
1

正しい心の誰もこれを次のように行うことはありませんが、より複雑な例で役立つ場合に備えてここにあります

import operator
map(operator.attrgetter("id"), myObjects)
于 2010-11-23T23:34:53.223 に答える