2010-07-18 68 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