我需要一种方法将多个键映射到字典

时间:2016-08-11 17:07:02

标签: 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中,就将键附加到映射到该值的键列表中;否则,将键值对添加到词典中。

修改 如果我把你们当中的很多人搞糊涂了,我很抱歉,如果以下内容让你们更加困惑,我真的很抱歉:)

这是我想要解决的原始问题:给定等式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对中的值必须是元组。

3 个答案:

答案 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 的功能一致,则需要通过它创建它的元组。

好消息是,如果您知道键元组的组件都是唯一的,那么您就可以使用它而不必大惊小怪。