2010-07-18 34 views
2

我有类似follwing的东西。Python面向对象的模型

一个人有许多同一型号的车属于某种状态的颜色。

我设计了一个Person类具有属性person namecar modelcar yearcar statecar color为属性。颜色应该是一个列表,因为一个人可以拥有许多不同颜色但同一车型的汽车。

现在如何查找和打印2个不同的人拥有相同的汽车模型和相同的汽车颜色但属于面向对象的不同状态?

我是Python新手。

在将颜色插入人物对象时,如何插入列表以及如何从列表中检索?我知道如何做一个属性,但我对列表操作有点困惑。

的数据可以是这样的:

person1 ford [red,blue,yellow] new-york 
person2 honda [red,blue]  new-york 
person3 ford [red,grey]  california 
person4 ford [red]    california 
person5 honda [red]    new-york 

现在我的结果应该只是:

[(person1,person5)] (same model car,same color, different state) 

回答

2

您想了解一些列表操作:

$ python 
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> l=[] 
>>> l.append("honda") 
>>> l.append("ford") 
>>> l 
['honda', 'ford'] 
>>> l[0] 
'honda' 
>>> l.pop(0) 
'honda' 
>>> l.pop(0) 
'ford' 
>>> l.pop(0) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: pop from empty list 

如果你想找到几个人相匹配的属性,你可以做一些 迭代(这里的一些伪代码表示的,因为我觉得侧重于 算法是不是注重蟒蛇做到这一点)更多有用:

results = [] 
foreach p1 in [list of people] 
    foreach p2 in [list of people] 
     next if p1 == p2 
     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 

此代码比较对的人。它不会将自己与 进行比较。它不会比较居住在同一州的人,因为你要求“..但属于不同的州”。所以让我们过滤掉那些相同状态的人 。它只比较拥有相同类型汽车的人。 (如果 人拥有不同类型的汽车,那么您只需添加两个嵌套的 循环。)然后它记录具有相同车辆颜色的成对人员。

该算法存在潜在的错误:它会报告[(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 == jj定义为以i+1开头。

+0

感谢这么多...帮助很大。 – jerrygo 2010-07-19 18:08:28

2

你可能想从person单独建模statecar。然后,每个人可以汽车列表,并在一个州(甚至国家,取决于你的型号)列表。这些是has-a的关系。如果需要,还可以稍后再继承car的子类并在以后再生成sportsCar

2

还有一堆的方式来做到这一点。如果你有很多数据,那么我建议你继续使用python的内置sqlite支持来处理基于数据库的实现(实际上并不困难)。数据库引擎专用于搜索。由于每人可以有多种颜色,因此您需要两张桌子。人员表格将具有以下列:id,名称,模型,状态。颜色表将具有:人物,颜色。 personid列将包含颜色表中的行对应的id号。然后,您可以在具有相同personid值(这是列表的数据库版本)的颜色表中包含多行。 sqlAlchemy是一个库,用于帮助您使用python对象实现数据库,您可能会发现它更适合您正在尝试的操作。 sqlAlchemy ORM Tutorial将引导您使用带有两个表(用户,地址)的sqlite数据库,这些表与您需要的非常相似。

现在如果你想坚持独立Python类,你将不得不让人们实例的列表,并遍历它们都在寻找匹配。简单的颜色匹配方法是将颜色列表转换为集合并进行交集。

>>> s1 = set(['red','blue','yellow']) 
>>> s2 = set(['red','blue']) 
>>> s1.intersection(s2) 
set(['blue', 'red']) 

迭代通过人员实例列表的快捷方式是使用python的itertools库并使用排列生成器。

from itertools import permutations 
people = ['p1', 'p2', 'p3'] 
for p1, p2 in itertools.permutations(people,2): 
    print p1, p2 

p1 p2 
p1 p3 
p2 p1 
p2 p3 
p3 p1 
p3 p2 

希望这足以帮助你一路顺风。重新读你的问题,看起来你可能需要更多地阅读python编程。但是为了解决你关于列表的问题,这里有一些代码可以帮助你。

class Person(object): 
    def __init__(self, name, model, colors, state): 
     self.name = name 
     self.model = model 
     self.colors = colors 
     self.state = state 

p1 = Person('p1', 'ford', ['red', 'blue'], 'new-york') 
p2 = Person('p2', 'honda', ['red', 'blue'], 'new-york') 

persons = [p1, p2] 
    # or 
persons = [] 
persons.append(p1) 
persons.append(p2) 

p1.color.append('yellow') 
    # or 
persons[0].color.append('yellow') 
+0

谢谢你的回复。非常有帮助。 – jerrygo 2010-07-19 18:09:04