我在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
但没有什么对我有用。任何帮助将不胜感激。
答案 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]