Pythonのオブジェクトのリストがあり、それぞれにid
プロパティがあります。それらのIDのリストを取得したい。
C#で書く
myObjects.Select(obj => obj.id);
Pythonでこれを行うにはどうすればよいですか?
Pythonのオブジェクトのリストがあり、それぞれにid
プロパティがあります。それらのIDのリストを取得したい。
C#で書く
myObjects.Select(obj => obj.id);
Pythonでこれを行うにはどうすればよいですか?
ここで「リスト内包表記」のセクションを確認してください:http://docs.python.org/tutorial/datastructures.html
開始リストが呼び出されoriginal_list
、新しいリストが呼び出されid_list
た場合、次のようなことができます。
id_list = [x.id for x in original_list]
[obj.id for obj in myObjects]
それが大きなリストであり、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
この場合、同等のリスト内包表記が機能します。
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"))
正しい心の誰もこれを次のように行うことはありませんが、より複雑な例で役立つ場合に備えてここにあります
import operator
map(operator.attrgetter("id"), myObjects)