【问题标题】:Replace elements in a list of lists python替换列表python列表中的元素
【发布时间】:2018-09-24 16:04:36
【问题描述】:

我有一个列表如下:

     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']]

为什么更改没有反映在列表中?

【问题讨论】:

  • 你正在通过for a in x复制列表中的东西,而不是直接指向x的元素。
  • 旁注:从不隐藏内置插件。使用list_L 而不是list 作为变量名。
  • @jpp 或者最好是描述内容的不太通用的东西...namesletter_and_name 或其他东西... :)

标签: python string list


【解决方案1】:

因为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]

【讨论】:

  • 考虑到bob 可以出现在子列表中的任何位置,“更多pythonic”部分并不是真正的通用部分。
  • @Austin,可能。鉴于示例输入,我很乐意在使其更通用之前等待一段时间:)
  • @jpp 不要忘记可怜的“鲍比” :)
  • 大声笑。如果您这么认为,请使用if a == 'bob': 而不是if 'bob' in a:
  • 或 bobaganoush 哈哈
【解决方案2】:

我将使用一个简单的示例,但基本上x 是另一个变量并且没有链接到列表元素。您必须直接更改列表元素才能更改列表。

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

这会改变列表

【讨论】:

    【解决方案3】:

    你可以尝试使用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】:

      我可能有点喜欢参加聚会,但更 Pythonic 的方式是使用 maplist 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函数来执行替换。

      我希望这对正在寻找类似内容的其他人有所帮助。

      【讨论】:

      • 我在找这个。非常感谢! @lu5er
      【解决方案5】:

      这是因为您只是更改临时变量 a。 列表 = [1,2,3] 对于列表中的 i: i+=1

      列表仍将是 [1,2,3]

      你必须根据它在列表中的索引来编辑字符串

      【讨论】:

        猜你喜欢
        • 2018-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多