我有一个列表列表,如下所示:
list=[]
*some code to append elements to list*
list=[['a','bob'],['a','bob'],['a','john']]
我要浏览此列表,并将'bob'的所有实例更改为'b',而其他实例保持不变。
for x in list:
for a in x:
if "bob" in a:
a.replace("bob", 'b')
打印出x后,它仍然与list相同,但不如下:
list=[['a','b'],['a','b'],['a','john']]
为什么更改未反映在列表中?
答案 0 :(得分:2)
由于str.replace
不能就地运行 ,因此returns a copy。作为不可变对象,您需要将字符串分配到列表列表中的元素。
如果您通过enumerate
提取索引整数,则可以直接分配给列表列表:
L = [['a','bob'],['a','bob'],['a','john']]
for i, x in enumerate(L):
for j, a in enumerate(x):
if 'bob' in a:
L[i][j] = a.replace('bob', 'b')
结果:
[['a', 'b'], ['a', 'b'], ['a', 'john']]
更多Pythonic将使用列表理解来创建新列表。例如,如果两个值中只有第二个包含需要检查的名称:
L = [[i, j if j != 'bob' else 'b'] for i, j in L]
答案 1 :(得分:0)
我将使用一个简单的示例,但是基本上x
是另一个变量,并且没有链接到list元素。您必须直接更改list元素才能更改列表。
l=[1,2,3,4]
for x in l:
x=x+1
这不会更改列表
l=[1,2,3,4]
for i,x in enumerate(l):
l[i]=x+1
这会更改列表
答案 2 :(得分:0)
之所以如此,是因为您仅更改了临时变量a。 清单= [1,2,3] 对于清单中的我: i + = 1
列表仍为[1,2,3]
您必须根据列表中的索引来编辑字符串
答案 3 :(得分:0)
您可以尝试使用python的字典对象
import numpy as np
L = [['a','bob'],['a','bob'],['a','john']]
dic = {'bob':'b'} # you can specify more changes here
new_list = [dic.get(n, n) for n in np.concatenate(L)]
print(np.reshape(new_list,[-1,2]).tolist())
结果是
[['a', 'b'], ['a', 'b'], ['a', 'john']]
答案 4 :(得分:0)
我可能对聚会不太了解,但是使用Python map
和list comprehension
可以做到这一点。它可以对具有任意多个值的列表列表进行操作。
l = [['a','bob'],['a','bob'],['a','john']]
[list(map(lambda x: x if x != 'bob' else 'b', i)) for i in l]
它为您提供所需的输出
[['a', 'b'], ['a', 'b'], ['a', 'john']]
主要思想是,内部循环遍历内部循环并使用简单的lambda
函数执行替换。
我希望这对正在寻找类似物品的其他人有所帮助。