2010-11-23 12 views
12

私はPythonでオブジェクトのリストを持っていて、それぞれはidのプロパティを持っています。私はそれらのIDのリストを取得したい。Pythonに相当するC#の.Select?

C#では私はPythonでこれを行うだろうか

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

を書くだろうか?

答えて

10
[obj.id for obj in myObjects] 
:あなたのスタートリストが original_listと呼ばれ、新しいリストが id_list呼び出された場合 http://docs.python.org/tutorial/datastructures.html

を、あなたはこのような何かを行うことができます

+0

は右...リスト内包。それらについて忘れてしまった:) – mpen

17

ここでは、「リスト内包」のセクションをご覧ください:

id_list = [x.id for x in original_list] 
6

これは大きなリストで、idsを一度処理するだけであれば、ジェネレータ式もあります。

ids = (obj.id for obj in my_objects) 

for id in ids: 
    do_something(id) 

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

ジェネレータ表現を含むもう1つの警告は、ジェネレータ表現が含まれているリソースがまだ開いている場合に限りアクセスできるということです。たとえば、次のコードは失敗します。

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

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

この場合、同等のリストの理解が有効です。 、彼らの権利を念頭に置い

1

誰もがこの次のようにしないだろうが、あなたがC#の直接対応はPythonで選択したい場合は、ここでそれはケースでは、より複雑な例

import operator 
map(operator.attrgetter("id"), myObjects) 
2

に便利になるさサードパーティのライブラリを使用する代償として、asqパッケージを使用して、Python iterablesよりもオブジェクトにインスピレーションを与えるLINQを提供することができます。あなたの質問でのC#コードASQ使用になる:

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

または、ASQの別の特徴と組み合わせる:

from asq.selectors import a_ 
query(myObjects).select(a_("id"))