<p>你的设计似乎有缺陷。首先,<code>People</code>实际上是<code>Person</code>。这是一个重要的区别,因为类名应该与构建它的数据和函数相匹配。在你的例子中,一组人没有一个年龄和身份证,但是一个人有。一旦你创建了一个人,你会把他们放进一个叫做“人”的列表中。然后,简化/过滤/映射操作(如您请求的操作)很简单。你知道吗</p>
<pre><code>class Person:
def __init__(self, uid, age):
self.uid = uid
self.age = age
def __repr__(self):
return "Person (id: {}, age: {})".format(self.uid, self.age)
people = [
Person(1, 11),
Person(2, 20),
Person(3, 15)
]
underage_people = [p for p in people if p.age < 18]
print(underage_people)
</code></pre>
<p>输出:</p>
<pre class="lang-none prettyprint-override"><code>[Person (id: 1, age: 11), Person (id: 3, age: 15)]
</code></pre>
<p>如果需要,可以将此列表理解放在静态类函数中,如<a href="https://stackoverflow.com/a/51551983/6243352">atline's answer</a>,但对我来说似乎不合适。这样的方法应该属于其他管理人员的类,例如,需要确定谁没有资格投票的<code>VoterRegistration</code>应用程序类。或者它可能在一个<code>People</code>类中,这个类以某种方式收集<code>Person</code>;无论哪种方式,我认为清楚地确定您在用类和对象建模什么样的数据和关系是很重要的。在这两种情况下,<code>People</code>类都会有一个<code>Person</code>对象的成员列表和各种各样的函数来操作和报告这些数据,例如<code>get_underage()</code>(上面写在list comp中)或<code>get_median_age()</code>。下面是我所说内容的具体示意图:</p>
<pre><code>class Person:
def __init__(self, uid, age):
self.uid = uid
self.age = age
def __lt__(self, other):
return self.age < other.age
def __repr__(self):
return "Person (id: {}, age: {})".format(self.uid, self.age)
class People:
def __init__(self, people):
self.people = people
def get_underage(self):
return [p for p in self.people if p.age < 18]
def get_average_age(self):
return sum([p.age for p in self.people]) / len(self.people)
def get_oldest(self):
return max(self.people)
def get_youngest(self):
return min(self.people)
people = People([
Person(1, 11),
Person(2, 20),
Person(3, 15)
])
print("Underage people: {}".format(people.get_underage()))
print("Average age: {}".format(people.get_average_age()))
print("Oldest: {}".format(people.get_oldest()))
print("Youngest: {}".format(people.get_youngest()))
</code></pre>
<p>输出:</p>
<pre class="lang-none prettyprint-override"><code>Underage people: [Person (id: 1, age: 11), Person (id: 3, age: 15)]
Average age: 15.333333333333334
Oldest: Person (id: 2, age: 20)
Youngest: Person (id: 1, age: 11)
</code></pre>
<p>和一个<a href="https://repl.it/repls/NuttySpringgreenExponents" rel="nofollow noreferrer">repl</a>一起玩。你知道吗</p>