我正在创建一个修改列表中元素的功能,但它并没有一直改变......我的功能是:
# DO NOT DO THIS
class salesapproval_sale_order(osv.Model):
_inherit = 'sale.order'
# code
# DO THIS
class salesapproval_sale_order(osv.Model):
_inherit = 'sale.order'
# code
何时
def modifyValues(l):
for x in l:
if x == 1:
l[x] = 'a'
elif x == 2:
l[x] = 'b'
elif x == 3:
l[x] = 'c'
print (l)
输出是:
modifyValues([1, 2, 3, 2, 3, 1, 2, 2])
为什么它不会改变每个值?
答案 0 :(得分:0)
当您遍历循环时,您正在迭代循环元素而不是索引。
您需要使用enumerate
来获取索引以及值。
小型演示可以
def modifyValues(l):
for i,x in enumerate(l): # Use enumerate here.
if x == 1:
l[i] = 'a'
elif x == 2:
l[i] = 'b'
elif x == 3:
l[i] = 'c'
print (l)
输出
['a', 'b', 'c', 'b', 'c', 'a', 'b', 'b']
答案 1 :(得分:0)
您的代码不正确,因为当您迭代列表时 def modifyValues(l):
for x in l: // the value of x will be the position of value
if x == 1:// your if condition does not check for the value in the list, it only checks the position.
l[x] = 'a'
elif x == 2:
l[x] = 'b'
elif x == 3:
l[x] = 'c'
print (l)
要改进您的代码,请将此用作if条件
if l[x] == 1
答案 2 :(得分:0)
您应该使用字典来更改列表中的项目。
>>> def modifyValues(l):
... d = {'a': 1, 'b': 2, 'c': 3}
... modifyl = [k for i in l for k in d if d[k] == i]
... print(modifyl)
...
>>> modifyValues([1, 2, 3, 2, 3, 1, 2, 2])
['a', 'b', 'c', 'b', 'c', 'a', 'b', 'b']
>>>
您还可以使用ascii_lowercase
>>> from string import ascii_lowercase
>>> def modifyValues(l):
... modifyl = [v for i in l for k, v in enumerate(ascii_lowercase, 1) if i == k]
... print(modifyl)
...
>>> modifyValues([1, 2, 3, 2, 3, 1, 2, 2])
['a', 'b', 'c', 'b', 'c', 'a', 'b', 'b']