如何使一个字典中的值成为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