我有一组坐标(在元组中作为起源),我将其附加到字典中,然后是另一个元组(端点)。
{(0, 0, 0):(10, 10, 10)}
有可能将原点的多个相同坐标放入dict,然后是不同的端点。
如果我试试这个,它们会覆盖,这就是为什么我已经厌倦了here中存在可变对象的方法。唯一的问题是,如果我尝试从中获取x,y和z,则结果表明该对象不可迭代。
有人可以从那里修改代码(将在下面发布我正在做的事情)或者给我一个更好的方法来做到这一点?谢谢。 (对可变对象来说还是新手)
代码:
class coords(object):
def __init__(self,part):
self.part = part
def __str__(self):
return self.part
d = {}
d[coords((0, 10, 0))] = (0 ,0 ,0)
d[coords((0, 10, 0))] = (0 ,1 ,0)
d[coords((0, 10, 0))] = (0 ,2 ,0)
for k in d:
x, y, z = k
print x,y,z
#Here I get the error: "TypeError: 'coords' object is not iterable" at the line "x, y, z = k"
答案 0 :(得分:1)
你可以使用一个元组子类,它具有与标准元组相同的不同行为。
class htuple(tuple):
def __hash__(self):
return id(self)
def __eq__(self, other):
return self is other
现在您可以创建htuple
这样的内容:htuple((1,2,3))
这些htuple
的行为有点像list
s(它们仅在身份上相同)而且大部分都像tuple
s(可以用作字典键,可以迭代)等等):
{ htuple((1,2,3)): (4,5,6),
htuple((1,2,3)): (7,8,9) }
这是 hack (我不能强调这一点)。但也许在你的特殊情况下,这是一个你可以忍受的解决方案。
答案 1 :(得分:1)
获得所需内容的最简单方法是使用2元组端点列表:
endpoint_tuples = [((0, 0, 0), (1, 1, 1)), ((2, 3, 4), (5, 6, 7))]
for start_point, end_point in endpoint_tuples:
print start_point
print end_point
如果您需要找到某个起点p
的端点:
next(endpoints for endpoints in endpoint_tuples if endpoints[0] == p)
答案 2 :(得分:0)
您可能需要从 str 返回一个字符串而不是元组。然后在循环中使用从coords str 方法返回的键调用字典。
class coords(object):
def __init__(self,part):
self.part = part
def __str__(self):
return str(self.part)
d = {}
d[coords((0, 10, 0))] = (0 ,0 ,0)
d[coords((0, 10, 0))] = (0 ,1 ,0)
d[coords((0, 10, 0))] = (0 ,2 ,0)
for k in d:
x, y, z = d[k]
print x,y,z
答案 3 :(得分:0)
我参加派对有点晚了,但我认为这个解决方案应该放在桌面上。解决在散列表中的任何给定键上具有多个值的经典(尽管是非常基本的)方法是使用列表结构来枚举具有冲突键的所有值。最好的部分是你可以使用defaultdict
类型,没有游戏/技巧。
d = {}
values = [
(coords((0, 10, 0)), (0, 0, 0)),
(coords((0, 10, 0)), (0, 1, 0)),
(coords((0, 10, 0)), (0, 2, 0)),
]
for start, end in values:
if start not in d:
d[start] = []
d[start].append(end)
for start in d:
for end in d[start]:
x, y, z = end
print x,y,z
对我而言,这比@ Alfe的解决方案要少得多,这个解决方案涉及多个看似匹配的哈希键,并且仍然可以让你使用dict作为正确的词典。 (否则,重点是什么?)
此外,您不需要使用列表来存储多个值,我只是使用列表,因为它很简单/明显。您可以使用集合类型(用于自动重复数据删除),或者如果您认为可以使用辅助散列算法,则可以使用其他字典,如果您要发生很多冲突,等等......