【发布时间】:2016-02-16 13:16:40
【问题描述】:
假设我有一个程序可以用线和点创建一些方案。 所有的线都由两点决定。有这些类:
class Coordinates(object):
def __init__(self, x, y):
self.x = x
self.y = y
class Point(object):
def __init__(self, coordinates):
self.coordinates = coordinates
class Line(object):
def __init__(self, coordinates_1, coordinates_2):
self.coordinates_1 = coordinates_1
self.coordinates_2 = coordinates_2
方案采用线列表并创建唯一点列表。
class Circuit(object):
def __init__(self, element_list):
self.line_list = element_list
self.point_collection = set()
self.point_collection = self.generate_points()
def generate_points(self):
for line in self.line_list:
coordinates_pair = [line.coordinates_1, line.coordinates_2]
for coordinates in coordinates_pair:
self.point_collection.add(Point(coordinates))
return self.point_collection
哪些变体能够创建独特对象的列表或集合?如何在不使用集合和排序的情况下仅使用循环和条件来做到这一点?以及如何更简单?
UPD。我附加的代码无法正常工作。我尝试在 Point 类中添加 hash 和 eq 方法:
class Point(object):
def __init__(self, coordinates):
self.coordinates = coordinates
def __hash__(self):
return 0
def __eq__(self, other):
return True
然后我尝试用一些线条制作一个方案:
element_list=[]
element_list.append(Line(Coordinates(0,0), Coordinates(10,0)))
element_list.append(Line(Coordinates(10,0), Coordinates(10,20)))
circuit = Circuit(element_list)
print(circuit.point_collection)
这里的两条线等于四个点,其中两个点的坐标相同。因此,代码必须打印三个对象,但它只打印一个:
{<__main__.Point object at 0x0083E050>}
【问题讨论】:
-
使用集合并不等同于排序,因为集合对象是不同的可散列对象的无序集合。你能解释一下为什么你不想使用一套吗?这样我们就会知道您在寻找什么。
-
@arekolek 你能解释一下为什么你不想使用一套吗? - 我猜是 OP 的教授/老师说不要。
-
@Ian:那么,我的问题会变成“为什么老师不希望他们使用一套?”。
-
问题是这段代码不起作用。它只是返回它得到的所有点。我想知道如何正确地制作它。另外,我尝试创建一个递归解决方案,但它让我有点困惑。因此这种方式对我来说也很有趣。
-
关于集合不等同于排序的事实。我不是说集合然后我说排序,但我知道创建唯一列表然后主列表排序的算法,然后很容易找到唯一项目。效果很好
标签: python arrays algorithm list collections