Python 我需要一种将多个键映射到字典中相同值的方法

Python 我需要一种将多个键映射到字典中相同值的方法,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,诚然,这个问题似乎很流行,但我真的找不到它(也许我没有使用正确的搜索词)。无论如何,我需要这样的东西: tel = {} tel['1 12'] = 1729 tel['9 10'] = 1729 tel['1 2'] = 9 tel['2 1'] = 9 tel['1 1'] = 2 print(tel) {['1 1'] : 2, ['1 2', '2 1'] : 9, ['1 12', '9 10'] : 1729} 因此,只要一个键的值已经在dict中,就将该键附加到映射到该值的键列

诚然,这个问题似乎很流行,但我真的找不到它(也许我没有使用正确的搜索词)。无论如何,我需要这样的东西:

tel = {}
tel['1 12'] = 1729
tel['9 10'] = 1729
tel['1 2'] = 9
tel['2 1'] = 9
tel['1 1'] = 2
print(tel)

{['1 1'] : 2, ['1 2', '2 1'] : 9, ['1 12', '9 10'] : 1729}
因此,只要一个键的值已经在dict中,就将该键附加到映射到该值的键列表中;否则,将键值对添加到dict

编辑 如果我把你们弄糊涂了,我很抱歉,如果下面的事情让你更糊涂了,我真的很抱歉:)

这就是我想解决的原始问题:给定方程式a^3+b^3,生成一个字典,将a,b小于1000的所有正整数对值映射到计算时方程式的值。当两个对计算为相同的值时,我希望这两个对在字典中共享相同的值,并以某种方式分组在一起。(我已经知道我可以将不同的键映射到dict中的同一个值,但我需要这个分组)

因此,我的伪代码示例如下所示:

for a in range(1, 1000):
    for b in range(1, 1000):
        map pair (a, b) to a^3 + b^3
对于某些整数对(a,b)和(p,q),其中a!=p、 b!=q、 a^3+b^3==p^3+q^3。我希望这些对以某种方式组合在一起。例如,[(1,12),(9,10)]映射到1729。我希望这能让我更清楚地知道我想要什么

EDIT2
正如你们中的许多人指出的,如果这意味着更快的查找时间,我将切换键值对。这意味着key:value对中的值必须是元组。

正如许多评论已经指出的那样,您的键/值结构似乎是颠倒的。我建议将
int
值分解为键。通过这种方式,您可以使用int值作为键实现高效的字典查找,并在数据中实现更优雅的简单设计——使用字典作为键

例:
{9:('12','21'),2:('11',),1729:('910','112')}

尽管如此,下面的代码片段将满足您的要求。它首先映射如上所示的数据,然后基本上反转键/值

tel = {}
tel['1 12'] = 1729
tel['9 10'] = 1729
tel['1 2'] = 9
tel['2 1'] = 9
tel['1 1'] = 2
#-----------------------------------------------------------
from collections import defaultdict

new_tel = defaultdict(list)
for key, value in tel.items():
    new_tel[value].append(key)

# new_tel -> {9: ['1 2', '2 1'], 2: ['1 1'], 1729: ['9 10', '1 12']}
print {tuple(key):value for value, key in new_tel.items()}
>>> {('1 2', '2 1'): 9, ('1 1',): 2, ('9 10', '1 12'): 1729}

我知道这个线程很旧,但我刚刚遇到了这个问题,下面是我如何解决它的:

类多边形映射:
定义初始化(自):
self.\u map={}
定义设置项(自身、键、值):
自映射[键]=值
定义获取项目(自身,项目):
对于自映射中的键:
如果项==键:
返回自我。\u映射[项目]
如果项目在密钥中:
返回自我。\u映射[键]
一无所获
pm=PolyMap()
pm[(“x”,“y”)]=“z”
打印(pm[“x”])
#>>z
打印(pm[“y”])
#>>z
打印(pm[(“x”、“y”)])
#>>z
打印(pm[“z”])
#>>没有
这不会跟踪您使用过的关键组件,因此如果您多次使用同一个关键组件,并且希望获得一致的getitem功能,则需要将创建该组件时使用的元组传递给它


好消息是,如果您知道您的关键元组的组件都是唯一的,那么您可以毫无疑问地使用它。

对于通过搜索来到这里的人:

首先,反转映射

>>tmp={1729:['112','910',9:['12','21',2:['11']}
然后创建反向映射以获得所需的内容

>>tel={v:k代表k,vs在tmp中。items()代表v在vs}
>>>印刷(电话)
... {'1 12': 1729, '9 10': 1729, '1 2': 9, '2 1': 9, '1 1': 2}

为什么值不是键和键的值,在字典中多个键已经可以映射到同一个值似乎更有意义。那么你能解释一下正常的口述有什么问题吗?是否需要对指向特定值的键列表进行查找访问?列表是不可散列的,因此您无论如何也不能这样做。您可以使用元组,但正如@depperm所说,这似乎是背对背的。@asfeynman,请用具体的术语告诉我们有关数据的更多信息。什么与什么相关,必须如何搜索/索引?也许我们可以建议一种惯用的数据结构来解决这个问题。OP能否给出一个原因/解释,为什么当前值不能是键,而键就是值?对于OP来说,这就是你想要的,尽管这似乎是个坏主意。因此,有评论问你真正想要什么?@Kenny Ostrom Uhm,不太确定用你的代码替换我的答案是什么意思?我只是添加了一个解释和更好的格式。是的,显然。我第一次读错了,然后看到编辑通过了。我为我的草率无礼道歉。您可能应该使用
list
s作为您的值,而不是
tuple
s,因为
tuple
s不是为修改而设计的。我选择此答案是因为它满足了我当时的需要。但是,我将按照其他人的建议切换键和值的角色。谢谢