2010-07-18 8 views
2

J'ai quelque chose comme le suivant.Modèle orienté objet Python

Une personne ayant plusieurs couleurs de voitures du même modèle appartenant à un certain état.

J'ai conçu une classe personne ayant des attributs person name, car model, car year, car state et car color comme attributs. Et la couleur devrait être une liste car une personne peut avoir beaucoup de voitures de couleurs différentes mais du même modèle.

Maintenant, comment puis-je trouver et imprimer 2 personnes différentes qui ont le même modèle de voiture et la même couleur de voiture, mais appartiennent à différents états en termes orientés objet?

Je suis nouveau à Python.

Lors de l'insertion de couleur dans l'objet Personne, comment puis-je l'insérer dans la liste et comment puis-je l'extraire de la liste? Je sais comment le faire pour un attribut, mais je suis un peu confus au sujet des opérations de liste.

Les données peuvent ressembler à ceci:

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 

Maintenant, mon résultat ne devrait être:

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

Répondre

2

que vous vouliez savoir un peu plus sur la manipulation de la liste:

$ 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 

Si vous voulez trouver plusieurs personnes avec des attributs correspondant, vous pourriez faire une itération (représenté ici dans une pseudo-code, parce que je pense mettant l'accent sur l'algorithme est plus utile que de se concentrer sur le python pour y arriver):

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 

Ce code compare les paires de personnes. Il ne compare pas une personne contre eux-mêmes. Il ne compare pas les gens qui vivent dans le même état parce que vous avez demandé ".. mais appartiennent à des états différents". Donc, nous allons filtrer ces mêmes états personnes. Il compare seulement les personnes qui possèdent le même type de voiture. (Si personnes possédaient différents types de voitures, alors vous en ajouteriez deux de plus imbriquées pour les boucles .) Ensuite, il note les paires de personnes qui ont la même couleur de voiture.

Il y a un bug potentiel dans cet algorithme: il va rapporter [(person1, person2), (person2, person1)]. Les entrées sont donc dupliquées.Il est possible de modifier l'algorithme pour rechercher juste le triangle supérieur ou inférieur de personnes si vous ne voulez que cette duplication:

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 

Remarque, nous pouvons supprimer le next if p1 == p2 chèque parce que nous ne pouvons pas explicitement obtenir i == j. j est défini pour commencer par i+1.

+0

Merci beaucoup ... Cela m'a beaucoup aidé. – jerrygo

2

Vous pouvez modéliser state et car séparément person. Ensuite, chaque personne peut avoir une liste de voitures, et vivre dans un état (ou même une liste d'états, selon votre modèle). Ce sont a-a relations. Il vous permettra également de sous-classer car plus tard et de faire sportsCar plus tard, si vous voulez.

2

Il y a plusieurs façons de le faire. Si vous avez beaucoup de données, je vous recommande d'aller de l'avant et de vous attaquer à une implémentation basée sur une base de données en utilisant le support sqlite intégré de python (ce qui n'est pas si difficile). Un moteur de base de données est spécialement conçu pour la recherche. Vous auriez besoin de deux tables puisque vous pouvez avoir plusieurs couleurs par personne. La table de personne aurait les colonnes suivantes: id, nom, modèle, état. La table de couleurs aurait: personid, color. La colonne personid contiendrait le numéro d'identification auquel correspond la ligne de la table de couleurs. Vous pouvez alors avoir plusieurs lignes dans la table de couleurs avec la même valeur personid (qui est la version de base de données d'une liste). sqlAlchemy est une bibliothèque pour aider à implémenter une base de données en utilisant des objets python que vous pouvez trouver plus approprié avec ce que vous essayez de faire. Le sqlAlchemy ORM Tutorial vous aide à travailler avec une base de données sqlite avec deux tables (utilisateurs, adresses) qui sont très similaires à ce dont vous auriez besoin.

Maintenant, si vous voulez vous contenter des classes python, vous devrez avoir une liste d'instances de personnes et les parcourir toutes à la recherche de correspondances. Une simplification pratique pour votre correspondance des couleurs est de convertir les listes de couleurs en ensembles et faire une intersection.

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

Un raccourci pour votre itération dans la liste des instances personnes est d'utiliser la bibliothèque itertools de python et utiliser le générateur de permutations.

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 

Espérons que cela soit suffisant pour vous aider. En relisant votre question, il semble que vous ayez besoin de faire plus de lecture sur la programmation en python. Mais pour répondre à votre question sur les listes, voici un petit bout de code qui pourrait vous aider.

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

Merci d'avoir répondu. Était très utile. – jerrygo

Questions connexes