Объектно-ориентированная модель Python - PullRequest
2 голосов
/ 19 июля 2010

У меня есть что-то вроде следующего.

Человек, имеющий много цветов автомобилей одной и той же модели, принадлежащих к какому-либо штату.

Я разработал класс person с атрибутами person name, car model, car year, car state и car 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)

Ответы [ 3 ]

2 голосов
/ 19 июля 2010

Вы хотели немного узнать о манипуляции со списком:

$ 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 == j. j определено для начала с i+1.

2 голосов
/ 19 июля 2010

Есть множество способов сделать это. Если у вас много данных, я бы порекомендовал вам заняться реализацией на основе базы данных, используя встроенную в Python поддержку sqlite (что на самом деле не так сложно). Механизм базы данных специально создан для поиска. Вам понадобятся две таблицы, так как вы можете иметь несколько цветов на человека. Таблица person будет иметь следующие столбцы: id, имя, модель, состояние. Таблица цветов будет иметь: лицо, цвет. Столбец personid будет содержать идентификационный номер, которому соответствует строка в таблице цветов. После этого вы можете иметь несколько строк в таблице цветов с одним и тем же значением personid (которое является версией списка в базе данных). sqlAlchemy - это библиотека, помогающая реализовать базу данных с использованием объектов Python, которые вы можете найти более подходящими для того, что вы пытаетесь сделать. sqlAlchemy ORM Tutorial проведет вас через работу с базой данных sqlite с двумя таблицами (пользователи, адреса), которые очень похожи на то, что вам нужно.

Теперь, если вы хотите придерживаться только классов Python, вам нужно будет иметь список экземпляров людей и перебирать их все в поисках совпадений. Удобное упрощение для вашего соответствия цветов состоит в том, чтобы преобразовать списки цветов в наборы и сделать пересечение.

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

Сокращение для вашей итерации по списку людей состоит в том, чтобы использовать библиотеку itertools в python и использовать генератор перестановок.

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')
2 голосов
/ 19 июля 2010

Возможно, вы захотите смоделировать state и car отдельно от person.Затем каждый человек может иметь список автомобилей и жить в состоянии (или даже список состояний, в зависимости от вашей модели).Это отношения has-a .Это также позволит вам создать подкласс car позже и сделать sportsCar позже, если хотите.

...