2010-11-23 26 views
12

Python'da bir nesne listesi var ve bunların her birinin bir id özelliği var. Bu kimliklerin bir listesini almak istiyorum.C# 's Python eşdeğeri .Select?

C#

Ben

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

nasıl Python bu yapardın yazardım? Burada "Liste Anlama" bölümünde dışarı

cevap

10
[obj.id for obj in myObjects] 
: http://docs.python.org/tutorial/datastructures.html başlangıç ​​listesi original_list denir ve yeni liste id_list denir

varsa, böyle bir şey yapabileceğini

+0

Sağ .. Liste tanımlama: ASQ başka özelliği ile kombine

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

veya. Bunları unuttum :) – mpen

17

Kontrol:

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

Büyük bir liste ise ve yalnızca bir kez ids işlemeniz gerekiyorsa, o zaman jeneratör ifadeleri de vardır.

ids = (obj.id for obj in my_objects) 

for id in ids: 
    do_something(id) 

Bir jeneratör ifade rasgele erişim desteklemez ama size talep üzerine her kodu oluşturulacaktır ve bu yüzden tek seferde bir listesini oluşturmaya önler. Jeneratör ifadeleri, range numaralı liste için xrange numaralı listeye aittir.

Generatör ifadeleriyle ilgili bir uyarı, yalnızca içindeki herhangi bir kaynak hala açık olduğu sürece erişilebilmesidir. Örneğin, aşağıdaki kod başarısız olur.

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

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

eşdeğer liste anlama bu durumda çalışacak. , Aklı başında

1

kimse bu şu şekilde yapacağını, ancak C# doğrudan bir eşdeğer Python seçmek istiyorsanız burada durumda, daha karmaşık bir örnek

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

yılında kullanışlı oluyor Bir üçüncü taraf kitaplığı kullanma pahasına, Python yineleyicileri üzerinde nesneler için LINQ nesneleri için ilham veren bir uygulama sağlayan asq paketini kullanabilirsiniz. olacaktı sorunuzu C# kodu asq kullanma:

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