获取TypeError:不可用类型:python dict中的'list'

时间:2015-06-09 06:11:54

标签: 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
    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: unhashable type: 'list' in python dict 到目前为止,我查看了Python dictionary : TypeError: unhashable type: 'list'Python, TypeError: unhashable type: 'list' 也看了这个Python creating dictionary key from a list of items 但没有什么对我有用。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:1)

问题出在这一行

aDict

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()} 是一个列表,而不是字符串。删除方括号,您的代码应该有效。

有一个很好的解释,为什么列表不能用作字典键 - https://wiki.python.org/moin/DictionaryKeys

另外,我建议您使用字典理解来创建新字典并将create or replace function public.js(src text, input json) returns json as $$ //-- select js('var a = input.test; var output = []; for(k in a) { output.push(10+a[k]); };', '{"test": [1,2,3]}'::json) //-- select public.js('plv8.elog(NOTICE, "yoyo");', null) // should not be possible plv8.elog(NOTICE, 'test'); var evalRes = null; (function() { var plv8 = null; //-- In order to disable execute, prepare... evalRes = eval('var output=null; ' + src + '; output;'); })(); plv8.elog(NOTICE, 'test2'); return JSON.stringify(evalRes); $$ LANGUAGE plv8; 名称绑定到它。

 mNavMenu = mNavigationView.getMenu();
 mNavMenu.addSubMenu("It's new bro .. ");

答案 1 :(得分:0)

你在这里创建新密钥:

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

哪个产生['device']。这是一个列表(不能用作字典键,因为它不可清除)...你需要摆脱外括号:

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

答案 2 :(得分:0)

你只是搞砸了创建一个新密钥 - dicts被实现为哈希映射并且需要可清除对象作为其密钥。您显然正在传递单元素列表(newk变量周围的方括号)。

这可行吗?

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

答案 3 :(得分:0)

newk作业中删除方括号,然后使用items代替iteritems

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