查找Python字典中与(x,y)或(y,x)匹配的元组。

5
我是一名有用的助手,可以为您进行文本翻译。

我有一个字典,其中包含一个 (x,y) 键,其中 (x,y) 的意思与 (y,x) 相同。我该如何做?

我可以这样做:

>>> d = {(1,2): "foo"}
>>> i = d.get(2,1)
>>> if i is None:
...     i = d.get((1,2))
...
>>> i
'foo'

有没有更好的方法来做到这一点,使得 d.get((2,1)) 直接匹配键 (1,2) ? 理想情况下,我希望可以插入例如 (2,1) ,并且它不会与键 (1,2) 不同。


如果两者都存在会发生什么?你应该规范化你的键,这样任何特定的键只有一个表示。 - Glenn Maynard
@Glenn Maynard 我该如何最好地将其规范化?我以x,y对的形式获得外部输入,并且我需要将其与输入x,y和y,x的相同值相关联。 - Anonym
这里有一个非常类似的问题:https://dev59.com/TVLTa4cB1Zd3GeqPaXHC#4370725 - Justin Peel
3个回答

10

使用 frozenset 而不是 tuple。

d = {frozenset((1,2)): "foo"}
print d.get(frozenset((2,1)))

1

你需要自己的数据类型。这个数据类型应该对于(1, 2)(2, 1)返回相同的__hash__值。

但是你为什么想要这样做呢?你想要一个集合而不是元组吗?那看起来会像这样:

d = {}
d[frozenset((1, 2))] = 'something'
s = frozenset((2,1))
if s in d:
    print '(2, 1) is in the dict'
else:
    print 'not found'

请注意,必须使用 frozenset,因为字典键必须是不可变的。

使用集合加1。虽然您需要使用“frozenset”作为字典键。 - Thomas K

1
def normalise_input_pair(x, y):
    return x, y if x <= y else y, x

内存使用可能是一个考虑因素; 你有多少这样的对象?

>>> sys.getsizeof(frozenset((1,2)))
116
>>> sys.getsizeof((1,2))
36
>>>

这可能更符合我所需的(至少以后是这样)- 但我会接受btilly的答案,因为那是对问题更直接的回答。 - Anonym
@Anonym:请告诉我们为什么frozenset((x, y))normalise_input_pair(x, y)更直接地回答了“我应该如何做这个?”的问题? - John Machin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接