【问题标题】:how do you replace multiple strings in a list using loop for python?如何使用 Python 循环替换列表中的多个字符串?
【发布时间】:2021-12-29 00:46:31
【问题描述】:

我想用另一个列表 a 中的元素替换列表 b 中的元素

#my list is
b = [('ba'),
 ('bb'),
 ('bc'),
 ('bd'),
 ('be'),
 ('bf'),
 ('bg'),
 ('bh'),
 ('bi')]

#The second list
a = [('bc_1'),
 ('bd_1'),
 ('be_1'),
 ('bf_1'),
 ('bg_1')]

我想将'bc', 'bd', 'be', 'bf', 'bg' 替换为'bc_1', 'bd_1', 'be_1', 'bf_1', 'bg_1'

我尝试了下一个代码

for i in a:
    if i in b:
      a = a.str.replace(i) 

但它不起作用

【问题讨论】:

    标签: python string loops


    【解决方案1】:

    如果_ 之前的部分匹配,您想替换a 中的值。

    避免不断循环a 的值的一种有效解决方案是首先构建一个字典来执行匹配。

    然后使用简单的列表推导式。

    a2 = {e.split('_')[0]: e for e in a}
    output = [a2.get(e, e) for e in b]
    

    输出:['ba', 'bb', 'bc_1', 'bd_1', 'be_1', 'bf_1', 'bg_1', 'bh', 'bi']

    此解决方案将快得多,尤其是在大型数据集上,因为由于键的散列,字典中的索引是 O(1)。

    a2 的内容:

    {'bc': 'bc_1', 'bd': 'bd_1', 'be': 'be_1', 'bf': 'bf_1', 'bg': 'bg_1'}
    

    【讨论】:

      【解决方案2】:

      试试这个:

      output = []
      for j in b:
          for i in a:
              if i.startswith(f"{j}_"):
                  output.append(i)
                  break
          else:  
              output.append(j)
      

      然后

      >>> output
      ['ba', 'bb', 'bc_1', 'bd_1', 'be_1', 'bf_1', 'bg_1', 'bh', 'bi']
      

      【讨论】:

        【解决方案3】:

        比较b的两个字母和a的两个字母是否相同

        for index, a_value in enumerate(b):
            for b_value in a:
                if a_value[0] == b_value[0] and a_value[1] == b_value[1]:
                    b_value[index] = a_value
        

        输出:

        b = ['ba', 'bb', 'bc_1', 'bd_1', 'be_1', 'bf_1', 'bg_1', 'bh', 'bi']
        
        • 比较目标的数量变化
        for index, b_value in enumerate(b):
            length = len(b_value)
            for a_value in a:
                count = 0
                for k in range(length):
                    if b_value[k] == a_value[k]:
                        count += 1
                    else:
                        break
                    if count == length:
                        b[index] = a_value
        

        【讨论】:

        • 我会在比较次数发生变化的情况下添加答案。
        【解决方案4】:
        for i in range(len(b)):
            for j in range(len(a)):
                if b[i] in a[j]:
                    b[i]=a[j]
        

        这应该可以为您完成这项工作。目前列表中的元素是整数。但是如果列表中的元素是元组,那么这将不起作用,因为元组不支持项目分配。您必须将 b 和 a 转换为列表列表,例如 a = [['bc_1'],['bd_1']] 等。然后下面的代码将起作用。

        for i in range(len(b)):
            for j in range(len(a)):
                if b[i][0] in a[j][0]:
                    b[i][0]=a[j][0]
        

        【讨论】:

        • b[i] in a[j] 匹配范围太广。例如'b' in 'abc' 也是True
        猜你喜欢
        • 1970-01-01
        • 2021-03-14
        • 1970-01-01
        • 2018-03-14
        • 1970-01-01
        • 2020-11-27
        • 1970-01-01
        • 2020-01-30
        • 2022-01-03
        相关资源
        最近更新 更多