使用字典更改列表中的项目

时间:2013-03-09 13:31:48

标签: python list dictionary replace

dic = {'a':'1','b':'2'}
lis = ['a','b']
for c in lis:
    c = dic[c]
print lis

列表没有改变。我曾预计该列表将更改为['1','2']。谁能解释一下?

4 个答案:

答案 0 :(得分:4)

不,这不是列表迭代的工作原理。 c是每次迭代时的新对象,如果更改该对象,原始列表(谢天谢地!)不会被修改。

如果您确实需要,请使用enumerate()

dic = {'a':'1','b':'2'}
lis = ['a','b']
for i, c in enumerate(lis):
    lis[i] = dic[c]
print lis

答案 1 :(得分:3)

您在迭代中缺少的最重要的事情是将元素分配给名称cc=dic[c]c重新绑定到新对象并且不更新原始对象到位。请考虑以下演示

>>> for i, c in enumerate(lst):
    print id(c), id(lst[i]),
    c=dic[c]
    print id(c)


4935168 4935168 4934712
4935192 4935192 5496728

因此,虽然在赋值之前,list元素和c引用了列表中的同一个对象,但是分配字典的值只是更改了引用

注意,这里id只是引用参考对象的标识符

注意,当您更改整个列表时,使用List Comprehension更容易,更快捷

lst = [dic[e] for e in lst]
['1', '2']

警告不要将变量命名为内置

答案 2 :(得分:2)

尝试使用索引而不是变量......

for i in range(len(li)):
    c = li[i]
    li[i] = dic[c]
print li

此外,切勿将list用作变量名称。
或使用enumerate之类的

for i, c in enumerate(li):
    li[i] = dic[c]
print li

或列表推导

lis = [dic[c] if c in dic else c for c in lis]

为什么不在做什么?
当您使用for x in y:时,x会获得y中对象/项目的值 因此,如果您更改x的值,则不会更改y[i]的值,i作为您所在的索引。

所以,如果你这样做

>>> y = range(5,10)
>>> for x in y:
    i = y.index(x)
    x += 10
    print i
    print 'Value of x    : %3d, id: %7d' % (x, id(x))
    print 'Value of y[i] : %3d, id: %7d' % (y[i], id(y[i]))
    print '-'*31

你会看到差异

答案 3 :(得分:2)

当你这样做时

for c in myList:
    c = something

您正在将名称c重新绑定到“某事物”,在这种情况下是dic[c]处的值。为了让Python真正“进入”列表,你必须在该列表上调用一个方法 - 方法list.__setitem__()告诉Python访问实际的列表对象和 mutate 该列表中的项目,不是为了进行简单的变量赋值。

for i, c in enumerate(myList):
    myList.__setitem__(dic[c])

当然,这也可以写成(更为pythonic):

for i, c in enumerate(myList):
    myList[i] = dic[c]

它看起来像一个变量赋值,但它不是。