我有一些类似下面的东西。
拥有属于某一状态的同一型号的多种颜色的汽车的人。
我设计了一个person类,将属性person name
、car model
、car year
、car state
和car color
作为属性。颜色应该是一个列表,因为一个人可以有许多不同颜色但相同型号的汽车。
现在我如何找到并打印两个不同的人,他们拥有相同的汽车型号和相同的汽车颜色,但在面向对象的术语中属于不同的状态?
我是Python的新手。
在person对象中插入颜色时,如何在列表中插入以及如何从列表中检索?我知道如何对属性执行此操作,但我对列表操作有点困惑。
数据可以是这样的:
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)
发布于 2010-07-19 06:33:04
您想了解一些关于列表操作的知识:
$ 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
检查,因为我们显式不能获取i == j
。定义了以i+1
开头的j
。
发布于 2010-07-19 06:04:56
您可能希望将state
和car
与person
分开建模。然后,每个人都可以一个汽车列表,并在一个州(甚至一个州的列表,这取决于你的型号)的。这些是的has-a关系。它还允许您稍后创建car
的子类,并在以后根据需要创建sportsCar
。
发布于 2010-07-19 07:01:30
有很多方法可以做到这一点。如果您有大量数据,那么我建议您使用python的内置sqlite支持来处理基于数据库的实现(这实际上并不难)。数据库引擎是专门为搜索而构建的。您将需要两个表,因为您可以为每个人提供多种颜色。person表将包含以下列: id、name、model、state。colors表应该有: personid,color。personid列将包含颜色表中的行所对应的id号。然后,您可以在颜色表中拥有多个具有相同PersonId值(这是列表的数据库版本)的行。sqlAlchemy是一个使用python对象来帮助实现数据库的库,您可能会发现它更适合您正在尝试做的事情。sqlAlchemy ORM Tutorial将指导您使用具有两个表(用户、地址)的sqlite数据库,这两个表与您需要的表非常相似。
现在,如果您只想使用python类,则必须有一个people实例列表,并遍历所有实例以查找匹配项。颜色匹配的一个方便的简化方法是将颜色列表转换为集合并进行交集。
>>> 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')
https://stackoverflow.com/questions/3277404
复制相似问题