dict中的多个键是相同的并且是元组

时间:2015-04-06 21:22:25

标签: python dictionary

我有一组坐标(在元组中作为起源),我将其附加到字典中,然后是另一个元组(端点)。

{(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"

4 个答案:

答案 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作为正确的词典。 (否则,重点是什么?)

此外,您不需要使用列表来存储多个值,我只是使用列表,因为它很简单/明显。您可以使用集合类型(用于自动重复数据删除),或者如果您认为可以使用辅助散列算法,则可以使用其他字典,如果您要发生很多冲突,等等......