2013-10-18 61 views
0

如何在對象列表中搜索屬性?假設我想所有對象的FNAME,也是年齡> 30或一些比賽中在Python中的對象列表屬性中搜索

#!usr/bin/python 
import sys 
import pickle 

class People: 
    def __init__(self, fname=None, lname=None, age=None, gender=None): 
     self.fname = fname 
     self.lname = lname 
     self.age = age 
     self.gender = gender 

    def display(self): 

     #fp = open("abc","w") 
     #fp.write("F.Name: "+ppl.fname+ "\nLName: "+ ppl.lname + "\nAge: "+  str(ppl.age)+ "\nGender: "+ ppl.gender) 




ppl = [People("Bean", "Sparrow", 22, "M"), People("Adam", "Sandler", 32, "M"),  People("Jack", "Marro", 28, "M")] 

fp = open("abc","w") 
for person in ppl: 
    fp.write("F.Name: "+person.fname+ "\nLName: "+ person.lname+ "\nAge: "+  str(person.age)+ "\nGender: "+ person.gender+"\n\n") 
fp.close() 
+0

讀回答這個問題,讓我再次想知道爲什麼人們默認列表內涵,而不是發電機。畢竟,後者更高效,如果你需要的話,你可以很容易地創建一個列表。 –

回答

1

在Python中有一個東西叫list comprehensions。列表理解是你的朋友。

獲取所有ppl.fname

all_fnames = [person.fname for person in ppl] 

獲取所有的人與大於30 ppl.age

all_greater_than_thirty = [person for person in ppl if person.age > 30] 

等。

編輯由於列表理解返回一個列表,你只用在地方,你原來有什麼列表,例如寫入文件:

with open("abc", "w") as fp: 
    for person in [p for p in ppl if p.age > 30]: 
     fp.write(...) # Fill it in with whatever you want to write 

甚至更​​好,但更先進,你會爲你的人民類中的方法,將返回格式化寫入文件的字符串,像People.to_string(),那麼你可以這樣做:

with open("abc", "w") as fp: 
    fp.writelines("%s\n" % person.to_string() for person in ppl if person.age > 30) 

的優點是效率高。再加上它看起來更好。

+0

我應該怎麼寫?我可以寫在顯示功能?我是新手 –

+0

取決於你想要對結果做什麼。看起來你想把它們寫入一個文件? –

+0

是的...你能架嗎? –

0

可以使用列表理解得到的人比30歲的名稱:

names_list = [person.name for person in ppl if person.age > 30] 

,做任何你想與他們做:)

0

這是你在找什麼:

for person in [p for p in ppl if (p.fname is "name" and p.age < 30)]: 
    # Do whatever you want with it...