2008-10-06 97 views
18

我有一个列表字符串标记。python字典更新方法

我想初始化一个字典,把键作为标记字符串和值作为数组索引。

for i, ithTag in enumerate(tag): 
    tagDict.update(ithTag=i) 

上述返回箱{“ithTag”:608} 608是第608次索引

我的问题是,虽然i被解释为一个变量,Python是治疗“ithTag”作为一个字符串而不是一个变量。

我很困惑,这种类型的具体问题很难。我希望我正确地回答了这个问题的标题,

谢谢!

+0

这是一个几乎可以解决的问题。我认为只有选择的答案比[这一个]更糟糕(http://stackoverflow.com/a/179005/131120)。想要改变或解释选择for-loop答案背后的原因吗? – erikbwork 2013-12-17 12:31:27

+0

我选择了那个,因为杰罗布先回答了;我只是马上标记出来。同样来自C#/ Java背景,Jerub的答案看起来更加熟悉,我喜欢他解释为什么.update()不适合我。 – freshWoWer 2014-01-04 00:05:20

回答

46

你真的想这样做:

for i, tag in enumerate(tag): 
    tagDict[tag] = i 

的.update()方法用于使用其他字典,而不是改变一个键/值对更新的字典。

2

我想这是你想要做什么:

d = {} 
for i, tag in enumerate(ithTag): 
    d[tag] = i 
2

尝试

tagDict[ithTag] = i 
17

如果你要聪明一点:

tagDict.update(map(reversed, enumerate(tag))) 

感谢Brian进行更新。这显然比迭代版本快5%。

(编辑:您指出我的答案是不正确的(现已修复)可能是最有效的/ Python的方式将托斯滕马立克氏回答感谢萨维里奥,略作修改:

tagDict.update((t, i) for (i,t) in enumerate(tag)) 

+0

实际上,update()可以直接使用一个序列,因此不需要构造中间字典。做tagDict.update(枚举(标签))实际上比迭代版本稍快(〜5%)。 – Brian 2008-10-06 08:34:49

12

这是一个班轮:

tagDict = dict((t, i) for i, t in enumerate(tag)) 
2

我想你想要的是这样的:

for i, ithTag in enumerate(tag): 
    tagDict.update({ithTag: i})