Python 修改包含元组的字典

Python 修改包含元组的字典,python,python-3.x,Python,Python 3.x,我正在尝试转换: 这一决定: dictio = {(3, 3): 'blue'} newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()} 到 newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()} 修改dict值没有问题,但元组键是问题所在 newDict = {int("{}{}".format(x[0],x[1]

我正在尝试转换: 这一决定:

dictio = {(3, 3): 'blue'}
newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()}  

newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()}  
修改dict值没有问题,但元组键是问题所在

newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()}  

看到元组无法修改,我该怎么做呢?

只需读取第一个dict的键,使用0和1索引分别格式化元组值,然后将它们和值分配给新dict

newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()}  
可以在一行中完成,用词如下

dictio = {(3,3):"blue", (5,5):"red"}   
newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()}  
然后

newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()}  
返回

newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()}  
>>>{33: 'blue', 55: 'red'}  

这是因为我们说“dictiono.items()”包含key:value对,它可以分别称为X和V。NewDict应该由键的第一部分(x[0])和键的第二部分(x[1])构成,并与之前未更改的值配对。

这是解决问题的一般方法:

newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()}  
dictio = {(3, 3): 'blue'}


dictio = {int("".join([str(e) for e in key])): dictio[key] for key in dictio.keys()}
输出:

newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()}  
>>> dictio
{33: 'blue'}

您可以执行以下操作:

newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()}  
dictio = {int(''.join(map(str, k))): v for k,v in dictio.items()}
dictio = {(3, 3): 'blue', (4, 2): 'yellow', (4, 31): 'red', (43, 1): 'green'}

new_dict = {}
for k,v in dictio.items():
    key = int(''.join(map(str, k)))
    if key in new_dict:
        new_dict[key].append(v)
    else:
        new_dict[key] = [v]
返回:

newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()}  
{33: 'blue'}
{33: 'blue', 42: 'red', 625: 'green'}
{33: ['blue'], 42: ['yellow'], 431: ['red', 'green']}
这也适用于以下示例:

newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()}  
dictio = {(3, 3): 'blue', (4, 2): 'red', (6, 2, 5): 'green'}
返回:

newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()}  
{33: 'blue'}
{33: 'blue', 42: 'red', 625: 'green'}
{33: ['blue'], 42: ['yellow'], 431: ['red', 'green']}
请注意,如果出现诸如
{(4,31):“red',(43,1):“green'}
之类的情况,这将导致密钥冲突,并且您的结果将包括最后一个键值对,在这种情况下,
{431:“green'}

newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()}  
在这种情况下,我将使用以下内容:

newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()}  
dictio = {int(''.join(map(str, k))): v for k,v in dictio.items()}
dictio = {(3, 3): 'blue', (4, 2): 'yellow', (4, 31): 'red', (43, 1): 'green'}

new_dict = {}
for k,v in dictio.items():
    key = int(''.join(map(str, k)))
    if key in new_dict:
        new_dict[key].append(v)
    else:
        new_dict[key] = [v]
返回:

newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()}  
{33: 'blue'}
{33: 'blue', 42: 'red', 625: 'green'}
{33: ['blue'], 42: ['yellow'], 431: ['red', 'green']}

可以使用算法将元组转换为整数:

newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()}  
dictio = {(3, 3): 'blue'}

dictio = {sum(j*10**i for i, j in enumerate(k)): v for k, v in dictio.items()}

print(dictio)

{33: 'blue'}
或者,如果元组的大小始终为2,则可以将f字符串与
int
一起使用:

newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()}  
dictio = {int(f'{k[0]}{k[1]}'): v for k, v in dictio.items()}

当然,您应该注意,这两种算法都没有冲突:第一种算法在
(1,0)
(0,10)
之间失败。后者将在
(12,3)
(1,23)
之间失败。在发生冲突的情况下,不清楚您需要什么。

您不应该在适当的位置修改任何字典键。在新键下添加值并删除旧键。给出一个确切的问题是什么会很有帮助。或者不要修改dict,而是构建一个新dict。即使你可以修改一个元组,你也不能把它变成一个
int
c={(5,55):“你好”,“55,5:“世界”)}。。。你的建议:问题-关键点冲突构建新词典,这是我一直在尝试的,但似乎无法完全理解代码。在迭代过程中在dict中添加或删除关键点是不安全的,可能会导致跳过或重复处理关键点。另外,
type(key)==type(tuple())
是测试某事物是否是元组的一种糟糕方法
isinstance(键,元组)
将是一个更好的检查,或者
type(键)是元组
,如果您需要精确的类型匹配。另外,提问者想要的是
33
,而不是
'33'
。谢谢您的评论,我编辑了我的答案。你能解释一下为什么它不安全吗?我不知道@User2357112添加或删除键可以触发dict的重建,移动所有内容并更改基础哈希表的大小。此外,根据散列代码和Python版本的详细信息,添加的新键可能最终位于当前迭代位置的任一侧。Python做了一些努力来检测这一点,如果它检测到dict在迭代过程中改变了大小,就会抛出一个错误,但是添加和删除相同数量的键会阻止检查的运行。谢谢,这很有趣,我将编辑我的答案,然后@user2357112提问者想要
33
,不是
'33'
。谢谢。修好了。
newDict = {int("{}{}".format(x[0],x[1])):v for x,v in dictio.items()}