簡體   English   中英

Python面向對象模型

[英]Python object oriented model

我有些喜歡。

具有同一種車型的多種顏色的屬於某個州的人。

我設計了一個人類,將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)

您可能要與person分開建模statecar 然后,每個人都可以擁有一個汽車列表,並且生活在一個州(或者甚至是州列表,具體取決於您的型號)。 這些是關系的。 如果需要,它還允許您以后細分car並稍后再制造sportsCar

您想對列表操作有所了解:

$ 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

如果您想找到幾個具有匹配屬性的人,則可以進行一些迭代(在此處以某些偽代碼表示,因為我認為專注於算法比專注於python更有效):

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

此代碼比較成對的人。 它不會將一個人與他們自己進行比較。 它不會比較生活在同一州的人,因為您要求輸入“ ..但屬於不同州”。 因此,讓我們過濾掉那些狀態相同的人。 它僅比較擁有相同類型汽車的人。 (如果人們擁有不同類型的汽車,則只需再添加兩個嵌套的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檢查,我們可以刪除next if p1 == p2因為我們明確無法獲得i == j j定義為以i+1開頭。

有很多方法可以做到這一點。 如果您有大量數據,那么我建議您繼續使用python內置的sqlite支持(實際上並不難)解決基於數據庫的實現。 數據庫引擎是專門為搜索而構建的。 您將需要兩個表,因為每個人可以有多種顏色。 人員表將包含以下列:ID,名稱,型號,狀態。 顏色表將具有:personid,顏色。 personid列將包含顏色表中的行對應的id號。 然后,您可以在顏色表中包含具有相同personid值的多行(這是列表的數據庫版本)。 sqlAlchemy是一個庫,可幫助您使用python對象實現數據庫,您可能會發現它們與嘗試執行的操作更加合適。 sqlAlchemy ORM教程將指導您使用帶有兩個表(用戶,地址)的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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM