2017-08-20 73 views
1

我试图更新的OrderedDict具有相同int值键的列表,像蟒蛇OrderedDict更新密钥列表具有相同价值

for idx in indexes: 
    res_dict[idx] = value 

其中valueint变量,indexes是的int s,这充当键listres_dictOrderedDict,试图解决上述在同一行,

res_dict[indexes]=value 

但得到的错误:

TypeError: unhashable type: 'list' 

是一个循环或列表理解在这里做此更新的唯一途径(S)?

+0

***指标是***的列表?和'keys'是什么?如果在'索引'内有一个列表(我敢打赌),那么确保它不被用作关键字;只是因为'list'不能用作关键字。 – Abdou

+0

@Abdou'indexes'是一个int类型的列表,它在这个上下文中充当关键字 – daiyue

+1

嗯...你可以在索引中为idx执行'res_dict.update((idx,value))'... –

回答

2

OrderedDict(以及字典)提供方法update一次更新多个值。

最Python的方式做你想做的事是:

res_dict.update((idx, value) for idx in indexes) 

这将让您的OrderedDict的原始顺序。

+1

如果'res_dict'已经是'OrderedDict',显式的'OrderedDict(...)'就会减少...现有的键将保持它们的顺序并且任何新的键将被正常插入... –

+0

是的,谢谢。为了精确! – tmarechaux

1

你可以update你的OrderedDict根据一个新的OrderedDict创建fromkeys

fromkeys方法允许给所有键的默认值,所以你不需要在这里明确的迭代。而且,因为它使用OrderedDict小号fromkeys它也将让您indexes的顺序:

>>> from collections import OrderedDict 
>>> indexes = [1, 2, 3] 
>>> value = 2 
>>> od = OrderedDict([(0, 10), (1, 10)]) 
>>> od.update(OrderedDict.fromkeys(indexes, value)) # that's the interesting line 
>>> od 
OrderedDict([(0, 10), (1, 2), (2, 2), (3, 2)]) 

注意,以防OrderedDict是空的前update你也可以使用:

>>> od = OrderedDict.fromkeys(indexes, value) 
>>> od 
OrderedDict([(1, 2), (2, 2), (3, 2)]) 
+0

在我的情况下,'od'在第一个位置不是空的,初始化的键:值对 – daiyue

+1

没关系,那么你需要明确的'.update(OrderedDict.fromkeys(indexes,value))''。只是一个想法。 :) – MSeifert

+0

'res_dict.update((idx,value)为索引中的idx)'也保留了'indexes'的顺序,对吧?考虑到'res_dict'并不是空的 – daiyue