Python 修改字典中的所有值

Python 修改字典中的所有值,python,dictionary,Python,Dictionary,代码如下: d = {'a':0, 'b':0, 'c':0, 'd':0} #at the beginning, all the values are 0. s = 'cbad' #a string indices = map(s.index, d.keys()) #get every key's index in s, i.e., a-2, b-1, c-0, d-3 #then set the values to keys' index d = dict(zip(d.keys(),

代码如下:

d = {'a':0, 'b':0, 'c':0, 'd':0}  #at the beginning, all the values are 0.
s = 'cbad'  #a string
indices = map(s.index, d.keys())  #get every key's index in s, i.e., a-2, b-1, c-0, d-3
#then set the values to keys' index
d = dict(zip(d.keys(), indices))  #this is how I do it, any better way?
print d  #{'a':2, 'c':0, 'b':1, 'd':3}
还有别的办法吗

上面的代码只是一个简单的代码来演示我的问题

for k in d.iterkeys():
    d[k] = s.index[k]
或者,如果您还不知道字符串中的字母:

d = {}
for i in range(len(s)):
    d[s[i]]=i
那怎么办

d = {'a':0, 'b':0, 'c':0, 'd':0}
s = 'cbad'
for k in d.iterkeys():
    d[k] = s.index(k)
??它不再是函数式编程了,但应该更具性能和python风格,也许:-)

编辑:使用python dict理解的函数变体(需要python 2.7+或3+):

甚至

{k : s.index(k) for k in d.iterkeys()}

如果一个新的口述是好的

类似的内容可能会使代码更具可读性:

dict([(x,y) for y,x in enumerate('cbad')])
但是你应该给出你真正想做的事情的更多细节。如果
s
中的字符与
d
的键不匹配,代码可能会失败。因此,
d
只是键的容器,值并不重要。在这种情况下,为什么不从列表开始?

使用dict的update()方法:

d.update((k,s.index(k)) for k in d.iterkeys())

您选择了正确的方法,但认为无需创建dict,如果您有能力同时执行此操作,则无需对其进行修改:

keys = ['a','b','c','d']
strK = 'bcad'
res = dict(zip(keys, (strK.index(i) for i in keys)))

python 2.7及以上版本的Dict理解

{key : indice for key, indice in zip(d.keys(), map(s.index, d.keys()))}
另一艘班轮:

dict([(k,s.index(k)) for (k,v) in d.items()])

您不需要将元组列表传递给
dict
。相反,您可以将字典理解与
枚举一起使用:

s = 'cbad'
d = {v: k for k, v in enumerate(s)}
如果需要处理中间步骤,包括初始值设置,可以使用:

d = dict.fromkeys('abcd', 0)
s = 'cbad'

indices = {v: k for k, v in enumerate(s)}

d = {k: indices[k] for k in d}         # dictionary comprehension
d = dict(zip(d, map(indices.get, d)))  # dict + zip alternative

print(d)

# {'a': 2, 'b': 1, 'c': 0, 'd': 3}

是的,我当然知道。我可以保证s中的字符符合d的键。谢谢你的列举方式,我碰巧忘了。很好。也可以省略括号。对于Python 3+
iterkeys()
已替换为
keys()
,请参阅
s = 'cbad'
d = {v: k for k, v in enumerate(s)}
d = dict.fromkeys('abcd', 0)
s = 'cbad'

indices = {v: k for k, v in enumerate(s)}

d = {k: indices[k] for k in d}         # dictionary comprehension
d = dict(zip(d, map(indices.get, d)))  # dict + zip alternative

print(d)

# {'a': 2, 'b': 1, 'c': 0, 'd': 3}