Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取类型错误:不可损坏类型:';列表';在python中_Python_Python 2.7_Dictionary - Fatal编程技术网

获取类型错误:不可损坏类型:';列表';在python中

获取类型错误:不可损坏类型:';列表';在python中,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,我有一本python字典: aDict = { 'form-1-device': ['2'], 'form-0-test_group': ['1'], 'form-1-test_scenario': ['3'], } 我需要从dict中删除form-1-device和device等。到目前为止,我已经尝试过: for k,v in bDict.iteritems(): newk = [k[k.find('-',5)+1:]] print newk

我有一本python字典:

aDict = {
    'form-1-device': ['2'],
    'form-0-test_group': ['1'],
    'form-1-test_scenario': ['3'],
}
我需要从dict中删除
form-1-device
device
等。到目前为止,我已经尝试过:

for k,v in bDict.iteritems():
    newk = [k[k.find('-',5)+1:]] 
    print newk
    aDict[newk] = aDict[k]
    del aDict[k]
或者代替

 aDict[newk] = aDict[k]
 del aDict[k]
这也能起作用

aDict[newk] = aDict.pop(k)
我的预期产出是:

aDict = {
    'device': ['2'],
    'test_group': ['1'],
    'test_scenario': ['3'],
}
但它给出了一个错误
TypeError:unhabable类型:python dict中的“list”
到目前为止,我一直在看 也看了一下这个
但对我来说什么都不管用。任何帮助都将不胜感激。

问题出在这一行

newk = [k[k.find('-',5)+1:]] 
newk
是一个列表,而不是字符串。去掉方括号,你的代码就可以工作了

有一个很好的解释,为什么列表不能用作字典键-

另外,我建议您使用字典理解创建一个新字典,并将
aDict
name绑定到它

aDict = {
    'form-1-device': ['2'],
    'form-0-test_group': ['1'],
    'form-1-test_scenario': ['3'],
    }

aDict = {k[k.find('-',5)+1:]:v for k, v in aDict.iteritems()}

您将新钥匙装在此处:

newk = [k[k.find('-',5)+1:]] 
它产生
['device']
。这是一个列表(不能用作字典键,因为它不可散列)…您需要去掉外括号:

newk = k[k.find('-',5)+1:]

创建一个新的密钥时,您简直把事情搞砸了——dict被实现为哈希映射,并且需要哈希对象作为它们的密钥。很明显,您正在传递单元素列表(在
newk
variable周围的方括号)

这样行吗

d = {
    'form-1-device': ['2'],
    'form-0-test_group': ['1'],
    'form-1-test_scenario': ['3'],
    }

for k,v in d.iteritems():
    new_key = k.split('-')[2]
    d[new_key] = d.pop(k)

expected = {
    'device': ['2'],
    'test_group': ['1'],
    'test_scenario': ['3'],
    }

assert d == expected

newk
分配中删除方括号,并使用
items
而不是
iteritems

for k,v in bDict.items():
    newk = k[k.find('-',5)+1:]
    print newk
    aDict[newk] = aDict[k]
    del aDict[k]

这是因为字典键是可散列的对象,而您正试图将一个不可散列的对象(列表)分配给您的键。因此,与之相反的是,我们非常感谢您的帮助,而不是
newk=[k[k.find('-',5)+1:][/code>do
newk=k[k.find('-',5)+1:][/code>。很好,很好。谢谢你的回答。不言自明+1.)