代码如下:
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}
还有其他方法吗?
PS。上面的代码只是一个简单的代码来证明我的问题。
答案 0 :(得分:9)
这样的事情可能会使你的代码更具可读性:
dict([(x,y) for y,x in enumerate('cbad')])
但你应该详细说明你真正想做的事情。如果s
中的字符不符合d
的键,您的代码可能会失败。所以d
只是键的容器,值并不重要。在这种情况下,为什么不从列表开始呢?
答案 1 :(得分:2)
怎么样?
d = {'a':0, 'b':0, 'c':0, 'd':0}
s = 'cbad'
for k in d.iterkeys():
d[k] = s.index(k)
?它不再是函数式编程,但应该更高性能和更多pythonic,或许: - )。
编辑:使用python dict-comprehensions的函数变体(需要Python 2.7+或3 +):
d.update({k : s.index(k) for k in d.iterkeys()})
甚至
{k : s.index(k) for k in d.iterkeys()}
如果新的词典没问题!
答案 2 :(得分:1)
另一个班轮:
dict([(k,s.index(k)) for (k,v) in d.items()])
答案 3 :(得分:0)
for k in d.iterkeys():
d[k] = s.index[k]
或者,如果您还不知道字符串中的字母:
d = {}
for i in range(len(s)):
d[s[i]]=i
答案 4 :(得分:0)
使用dict的update()方法:
d.update((k,s.index(k)) for k in d.iterkeys())
答案 5 :(得分:0)
你选择了正确的方法,但认为如果你有能力在同一时间内完成这项工作,就不需要创建dict然后修改它:
keys = ['a','b','c','d']
strK = 'bcad'
res = dict(zip(keys, (strK.index(i) for i in keys)))
答案 6 :(得分:0)
对python 2.7及以上版本的词典理解
{key : indice for key, indice in zip(d.keys(), map(s.index, d.keys()))}
答案 7 :(得分:0)
>>> d = {'a':0, 'b':0, 'c':0, 'd':0}
>>> s = 'cbad'
>>> for x in d:
d[x]=s.find(x)
>>> d
{'a': 2, 'c': 0, 'b': 1, 'd': 3}
答案 8 :(得分:0)
您不需要将元组列表传递给dict
。相反,您可以对enumerate
使用字典理解:
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}