2013-05-09 4 views
22

リスト内のオブジェクトの数をカウントする簡単で素早い方法を検索しようとしています。例: アトリビュートが一致するオブジェクトのリスト内のPython数の要素

class Person: 
    def __init__(self, Name, Age, Gender): 
     self.Name = Name 
     self.Age = Age 
     self.Gender = Gender 

# List of People 
PeopleList = [Person("Joan", 15, "F"), 
       Person("Henry", 18, "M"), 
       Person("Marg", 21, "F")] 

ここで、属性に基づいて引数に一致するこのリスト内のオブジェクトの数を数えるのに最も簡単な関数は何ですか?

def count(seq, pred): 
    return sum(1 for v in seq if pred(v)) 

print(count(PeopleList, lambda p: p.Gender == "F")) 
print(count(PeopleList, lambda p: p.Age < 20)) 

特に:私は関数を定義すると、複数の用途をよりシンプルであることを考えるPerson.Gender == "F" またはPerson.Age <個人的には20

答えて

28
class Person: 
    def __init__(self, Name, Age, Gender): 
     self.Name = Name 
     self.Age = Age 
     self.Gender = Gender 


>>> PeopleList = [Person("Joan", 15, "F"), 
       Person("Henry", 18, "M"), 
       Person("Marg", 21, "F")] 
>>> sum(p.Gender == "F" for p in PeopleList) 
2 
>>> sum(p.Age < 20 for p in PeopleList) 
2 
+15

私は ''(p.Gender == "F"の場合は 'pの場合はPeopleListの場合は' '' '' '' ''サブクラスint。 – wim

+4

@wim http://stackoverflow.com/questions/3174392/is-it-pythonic-to-use-bools-as-ints –

+0

はい、私はその投稿を認識しており、すでにアレックスの答えに私の-1票を持っています。 ;)http://stackoverflow.com/a/8169049/674039 – wim

1

のための2を返す 例えば、クエリを再利用したい場合

+0

編集:私は 'if'の位置を入れ替えました。ありがとう、固定。 – kampu

0

私はこれを好む:と完璧に読める(無用リストなどを作成しません)安いです

femaleCount = count(p for p in PeopleList if p.Gender == "F") 

(私が言うと思います:

def count(iterable): 
    return sum(1 for _ in iterable) 

その後、あなたはこのようにそれを使用することができますsum(1 for … if …)sum(p.Gender == "F" for …)の両方よりも良い)。

4

リストの理解度を使用し、その長さを取得するのがsum()を使用するよりも速いことがわかりました。 my tests ...

len([p for p in PeopleList if p.Gender == 'F']) 

によると

...の速さで1.59倍を実行します...

sum(p.Gender == "F" for p in PeopleList) 
+1

あなたが 'sum([PeopleListのpのために[p.Gender ==" F ")]をテストし、小さな、中規模、および巨大なデータの結果を投稿しない限り、 – jamylak

6

私は、これは古い質問が、これらの日の1つのSTDLIBの方法を知っていますこれは、

from collections import Counter 

c = Counter(getattr(person, 'gender') for person in PeopleList) 
# c now is a map of attribute values to counts -- eg: c['F'] 
関連する問題