如何在人员名单中找到不同国家的数量?

Pao*_*aJ. 1 python python-2.x

如何在人员名单中找到不同国家的数量?我有简单的班级人物

class Person(object):
    def __init__(self, nation, name):
        self.nation = nation
        self.name = name
        ...
Run Code Online (Sandbox Code Playgroud)

我可以遍历列表和增量字典(如果存在键值国家其他值为1)并获得国家的关键数量和国家数量,但我想知道是否有更多的pythonic方式,如c#中的linq

DSM*_*DSM 5

如果你想要不同国家的数量,你可以简单地选择len一个set.例如:

class Person(object):
    def __init__(self, nation, name):
        self.nation = nation
        self.name = name

People = [Person("Canada", "Dave"), Person("Scotland", "Alex"), Person("Canada", "Fred"), Person("Japan", "Kenta")]
Run Code Online (Sandbox Code Playgroud)

然后

>>> set(p.nation for p in People)
set(['Canada', 'Japan', 'Scotland'])
>>> {p.nation for p in People} # python 2.7
set(['Canada', 'Japan', 'Scotland'])
>>> len({p.nation for p in People})
3
Run Code Online (Sandbox Code Playgroud)

(x for x in y)是一个"生成器表达式",它{x for x in y}是一个"集合理解"(仅在2.7+中可用 - 它就像列表理解,但对于集合.)

如果您想要更具体的信息,可以使用Counter对象:

>>> from collections import Counter
>>> c = Counter(p.nation for p in People)
>>> c
Counter({'Canada': 2, 'Japan': 1, 'Scotland': 1})
>>> len(c)
3
>>> sum(c.values())
4
Run Code Online (Sandbox Code Playgroud)