假设您有一个类 Person,该类具有 person name(人名)、car model(汽车型号)、car year(汽车年份)、car state(汽车所在地)和 car color(汽车颜色)等属性。汽车颜色应该是一个列表,因为一个人可以拥有不同颜色的同一种型号的汽车。现在,如何查找并打印出两个拥有相同型号汽车和颜色的两个人,但他们来自不同的州?
2、解决方案
2.1 数据结构设计
为了解决这个问题,您可以将 state 和 car 从 Person 类中分离出来。这样,每个人都可以拥有一辆汽车列表,并居住在一个州(甚至多个州,具体取决于您的模型)。这些都是 has-a 关系。它还允许您稍后对 car 进行子类化,并在需要时创建 sportsCar。
2.2 查找算法
您可以通过以下步骤查找拥有相同属性的多个对象:
- 对于 person 列表中的每个 p1,
- 对于 person 列表中的每个 p2,
- 如果 p1 == p2,则继续下一个 p2。
- 如果 p1.state == p2.state,则继续下一个 p2。
- 如果 p1.car == p2.car,则执行以下操作:
- 对于 p1.colors 中的每个 c1,
- 对于 p2.colors 中的每个 c2,
- 如果 c1 == c2,则将 (p1, p2) 添加到 results 列表中。
这个算法比较了两个人。它不将一个人与自己比较。它不会比较居住在同一州的人,因为您要求“… 但属于不同状态”。因此,让我们过滤掉那些同州的人。它只比较拥有相同类型汽车的人。(如果人们拥有不同类型的汽车,那么您只需添加两个嵌套的 for 循环。)然后,它会注意到拥有相同颜色的汽车的人对。此算法中存在一个潜在的错误:它将报告 [(person1, person2),(person2, person1)]。因此,条目会被复制。如果不需要这种复制,则可以修改算法仅搜索人的上三角或下三角:
results = []
for i=0; i<people.last_index-1; i++
for j=i+1; j<people.last_index ; j++
p1 = people[i] ; p2 = people[j]
next if p1.state == p2.state
next unless p1.car == p2.car
foreach c1 in p1.colors
foreach c2 in p2.colors
results.append((p1,p2)) if c1 == c2
请注意,我们可以删除 next if p1 == p2 检查,因为我们明确无法获得 i == j。j 被定义为从 i+1 开始。
2.3 代码示例
以下代码示例演示了如何使用上述算法查找和打印拥有相同型号汽车和颜色但来自不同州的两个人:
class Person:
def __init__(self, name, model, colors, state):
self.name = name
self.model = model
self.colors = colors
self.state = state
def find_people_with_same_car_and_color_from_different_states(people):
results = []
for p1 in people:
for p2 in people:
if p1 == p2:
continue
if p1.state == p2.state:
continue
if p1.car != p2.car:
continue
for c1 in p1.colors:
for c2 in p2.colors:
if c1 == c2:
results.append((p1, p2))
return results
people = [
Person('p1', 'ford', ['red', 'blue'], 'new-york'),
Person('p2', 'honda', ['red', 'blue'], 'new-york'),
Person('p3', 'ford', ['red', 'grey'], 'california'),
Person('p4', 'ford', ['red'], 'california'),
Person('p5', 'honda', ['red'], 'new-york')
]
results = find_people_with_same_car_and_color_from_different_states(people)
for result in results:
print(result)
运行上面的代码,将打印出以下结果:
[(Person('p1', 'ford', ['red', 'blue'], 'new-york'), Person('p5', 'honda', ['red'], 'new-york'))]
这就是如何使用 Python 面向对象编程来查找拥有相同型号汽车和颜色但来自不同州的人。