如何使一个字典中的值成为python中新字典的键?

如何使一个字典中的值成为python中新字典的键?,python,dictionary,Python,Dictionary,比如说我有一本字典 dict{int:tuple(int,str)} 我想用这种格式制作一本新词典 dict{str:dict{int:int} 下面是我想得到的一个例子: d1 = { 1: (22, 'this is a phrase'), 2: (333, 'here is a sentence') } 通过一个函数,我需要能够操作第一个字典,得到第二个字典: d2 = { 'this is a phrase': {1: 22}, 'here is a s

比如说我有一本字典

dict{int:tuple(int,str)}

我想用这种格式制作一本新词典

dict{str:dict{int:int}

下面是我想得到的一个例子:

d1 = {
    1: (22, 'this is a phrase'),
    2: (333, 'here is a sentence')
}
通过一个函数,我需要能够操作第一个字典,得到第二个字典:

d2 = {
    'this is a phrase': {1: 22},
    'here is a sentence': {2: 333},

     }

真的很抱歉最初的格式不好,对我想要得到的东西进行了疯狂的描述。我只需要一个简单的描述,说明如何让这些值成为第二个字典的键。我希望这更清楚一些

假设您的数据顺序与您的问题一样一致,您可以执行以下操作:

d1 = {
    1: (22, 'this is a phrase',['apple', 'grape']),
    2: (333, 'here is a sentence',['grape', 'cherry'])
}

d2 = {}

for key, values in d1.items():
    for food in values[-1]:
        if food not in d2:
            d2[food] = {}
        d2[food][values[0]] = [values[1]]

print d2

# Output: {'cherry': {333: ['here is a sentence']}, 'grape': {333: ['here is a sentence'], 22: ['this is a phrase']}, 'apple': {22: ['this is a phrase']}}

假设您的数据顺序与问题中的一致,您可以执行以下操作:

d1 = {
    1: (22, 'this is a phrase',['apple', 'grape']),
    2: (333, 'here is a sentence',['grape', 'cherry'])
}

d2 = {}

for key, values in d1.items():
    for food in values[-1]:
        if food not in d2:
            d2[food] = {}
        d2[food][values[0]] = [values[1]]

print d2

# Output: {'cherry': {333: ['here is a sentence']}, 'grape': {333: ['here is a sentence'], 22: ['this is a phrase']}, 'apple': {22: ['this is a phrase']}}
这就产生了

{'this is a phrase': {1: 22}, 'here is a sentence': {2: 333}}
编辑以适应问题中更改的要求

这就产生了

{'this is a phrase': {1: 22}, 'here is a sentence': {2: 333}}

编辑以适应问题中更改的要求。

迭代
d1
中的键以获取要分解的值。对于每个值,迭代数组中的项
value[2]
,并在每个项下的
d2
中插入
{value[0],value[1]}
。将
d1[k1]
赋值给临时变量可能更容易读取:

d2 = {}
for k1 in d1.keys():
    item = d1[k1]
    for k2 in item[2]:
        if k2 in d2:
          d2[k2].append({item[0]: item[1]})
        else:
          d2[k2] = [{item[0]: item[1]}]
注意,在尝试追加之前,我们检查键是否在
d2
中;否则Python将尝试获取
d2[k2]
并抛出
KeyError
k2
不存在时。

迭代
d1
中的键以获取要反汇编的值。对于每个值,迭代数组中的项
value[2]
,并在每个项下的
d2
中插入
{value[0],value[1]}
。将
d1[k1]
赋值给临时变量可能更容易读取:

d2 = {}
for k1 in d1.keys():
    item = d1[k1]
    for k2 in item[2]:
        if k2 in d2:
          d2[k2].append({item[0]: item[1]})
        else:
          d2[k2] = [{item[0]: item[1]}]
注意,在尝试追加之前,我们检查键是否在
d2
中;否则Python将尝试获取
d2[k2]
并抛出

KeyError
k2
不存在时。

请小心,第一个示例产生了
TypeError
,第二个示例没有产生OP所述的预期输出。如果d1中的第一个键在最后一个值的列表中也包含“grape”,该怎么办?如何确保d2的新“grape”键包含其他丢失的值?谢谢,@GreenCell-更正后的版本现在应该给OP一个一致的答案。我已经将条目更改为列表,因为原始示例中的
grape
条目实际上是不可能的;它必须是一个列表,所以将它们全部列成列表可以简化代码。除了将条目列成列表之外,没有其他方法了吗?你不能给d2分配一个字典吗?当然可以,但是你必须决定用什么键来存储项目。小心,第一个例子产生了一个
TypeError
,第二个例子没有产生OP所说的预期输出。如果说d1中的第一个键在最后一个值的列表中也包含了“grape”呢?如何确保d2的新“grape”键包含其他丢失的值?谢谢,@GreenCell-更正后的版本现在应该给OP一个一致的答案。我已经将条目更改为列表,因为原始示例中的
grape
条目实际上是不可能的;它必须是一个列表,所以将它们全部列成列表可以简化代码。除了将条目列成列表之外,没有其他方法了吗?您不能将字典分配给d2吗?当然可以,但您必须决定使用哪些键来存储项目。我如何使第二个字典的键与第一个字典中的键的顺序相同?问题是字典是无序类型,因此您不能。您可以使用
OrderedDict
来维护它,或者如果顺序非常重要,可以使用
列表作为最终输出。我更新了答案,以支持嵌套
dict
中的多个键,因此,
'grape'
现在可以有多个值。如何使第二个字典的键与第一个字典中的键的顺序相同?问题是字典是无序类型,所以不能。您可以使用
OrderedDict
来维护它,或者如果顺序非常重要,可以使用
列表作为最终输出。我更新了答案,以支持嵌套的
dict
中的多个键,因此
'grape'
现在可以有多个值。这实际上为我产生了一个错误!ValueError:要解压缩的值太多(应为3个)。不太清楚为什么。你最初的问题在元组中有3个值,这就是为什么我用3个变量解压它。现在,对于编辑过的问题,我们应该只使用2,这实际上为我产生了一个错误!ValueError:要解压缩的值太多(应为3个)。不太清楚为什么。你最初的问题在元组中有3个值,这就是为什么我用3个变量解压它。现在,对于经过编辑的问题,我们应该只使用2