不可否认,这个问题似乎很流行,但我找不到它(也许我没有使用正确的搜索词)。无论如何,我需要这样的东西:
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中,就将键附加到映射到该值的键列表中;否则,将键值对添加到词典中。
修改 如果我把你们当中的很多人搞糊涂了,我很抱歉,如果以下内容让你们更加困惑,我真的很抱歉:)
这是我想要解决的原始问题:给定等式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对中的值必须是元组。
答案 0 :(得分:1)
正如许多评论已经指出的那样,您似乎将键/值结构反转。我建议您将int
值分解为键。这样,您可以使用int值作为键来实现高效的字典查找,并在数据中实现更优雅的简单设计 - 使用字典intended。
例如:{9: ('1 2', '2 1'), 2: ('1 1',), 1729: ('9 10', '1 12')}
据说下面的代码片段可以满足您的需求。它首先映射如上所示的数据,然后基本上反转键/值。
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}
答案 1 :(得分:1)
对于那些通过搜索来到这里的人:
首先,反转映射
>>> tmp = {1729: ['1 12','9 10'], 9: ['1 2','2 1'], 2: ['1 1']}
然后创建逆映射得到你想要的
>>> tel = {v: k for k,vs in tmp.items() for v in vs}
>>> print(tel)
... {'1 12': 1729, '9 10': 1729, '1 2': 9, '2 1': 9, '1 1': 2}
答案 2 :(得分:0)
我知道这个线程很旧,但是我刚遇到这个问题,这就是我的解决方法:
class PolyMap:
def __init__(self):
self._map = {}
def __setitem__(self, key, value):
self._map[key] = value
def __getitem__(self, item):
for keys in self._map:
if item == keys:
return self._map[item]
if item in keys:
return self._map[keys]
return None
pm = PolyMap()
pm[("x", "y")] = "z"
print(pm["x"])
# >> z
print(pm["y"])
# >> z
print(pm[("x", "y")])
# >> z
print(pm["z"])
# >> None
这不会跟踪您使用过的关键组件,因此,如果您多次使用同一关键组件,并且期望 getitem 的功能一致,则需要通过它创建它的元组。
好消息是,如果您知道键元组的组件都是唯一的,那么您就可以使用它而不必大惊小怪。