【问题标题】:Find and replace some elements in a list using python使用python查找和替换列表中的一些元素
【发布时间】:2018-08-05 11:04:29
【问题描述】:

我必须搜索列表中的所有元素,并用另一个元素替换所有出现的元素。最好的方法是什么?

例如,假设我的列表有以下元素:

data = ['a34b3f8b22783cf748d8ec99b651ddf35204d40c',
        'baa6cb4298d90db1c375c63ee28733eb144b7266',
        'CommitTest.txt',
        '=>',
        'text/CommitTest.txt',
        '0',
        'README.md',
        '=>',
        'text/README.md',
        '0']

我需要用字符'=>'前后元素的组合值替换所有出现的字符'=>',所以我需要的输出是:

data = ['a34b3f8b22783cf748d8ec99b651ddf35204d40c',
        'baa6cb4298d90db1c375c63ee28733eb144b7266',
        'CommitTest.txt=>text/CommitTest.txt',
        '0',
        'README.md=>text/README.md',
        '0']

这是我目前写的代码:

ind = data.index("=>")
item_to_replace = data[ind]
combine = data[ind-1]+data[ind]+data[ind+1]
replacement_value = combine
indices_to_replace = [i for i,x in enumerate(data) if x==item_to_replace]

for i in indices_to_replace:
    data[i] = replacement_value

data

然而,不需要的输出是这样的:

data = ['a34b3f8b22783cf748d8ec99b651ddf35204d40c',
        'baa6cb4298d90db1c375c63ee28733eb144b7266',
        'CommitTest.txt',
        'CommitTest.txt=>text/CommitTest.txt',
        'text/CommitTest.txt',
        '0',
        'README.md',
        'CommitTest.txt=>text/CommitTest.txt',
        'text/README.md',
        '0']

有没有更好的办法?

【问题讨论】:

  • 我不太明白。根据您的初始要求,“不需要的”输出实际上应该是什么?如果您想用组合的前一个值和下一个值替换“=>”?
  • @Nurjan - 不需要的输出是指我编写的代码产生的输出。但输出不是我需要的。

标签: python list indexing replace find


【解决方案1】:

你的一般算法是正确的。

但是,data.index("->") 只会找到“->”第一次出现的索引。

您需要找到所有出现的“=>”,将其存储在一个列表中,组合元素并为每个出现的地方替换。

要查找所有出现“=>”的索引,您可以使用:

indices = [i for i, x in enumerate(data) if x == "=>"]

【讨论】:

    【解决方案2】:

    正如@alpha_989 建议的首先找到=> 元素的索引并为每个出现替换,希望这可能会有所帮助

    >>> indices = [i for i, x in enumerate(data) if x == "=>"]
    >>> for i in indices: #this will add one index upper and one index lower of elem "=>" with elem
            data[i-1] = data[i-1]+ data[i] + data[i+1] 
    >>> for elem in data:
            if elem == "=>":
                del data[data.index("=>")+1]
                del data[data.index("=>")]
    >>> data
    ['a34b3f8b22783cf748d8ec99b651ddf35204d40c', 'baa6cb4298d90db1c375c63ee28733eb144b7266', 'CommitTest.txt=>text/CommitTest.txt', '0', 'README.md=>text/README.md', '0']
    

    【讨论】:

    • 这不起作用,它无法删除'=>'之后的值。如果你真的想要一个改变列表的答案,你需要添加del data[data.index("=>") + 1]
    【解决方案3】:

    已正确地向您指出data.index 只会返回元素第一次出现的索引。此外,您的代码不会删除 "=>" 之后和之前的条目。

    对于改变列表的解决方案,您可以使用del,但我建议使用 Python 提供的这种简洁的切片语法。

    indices = [i for i, val in enumerate(data) if val == '=>']
    
    for i in reversed(indices):
        data[i-1: i+2] = [data[i-1] + data[i] + data[i+1]]
    

    我还建议您尝试一次生成新列表的实现。更改列表可能是一种不好的做法,并且与创建新列表相比没有真正的优势。

    new_data = []
    i = 0
    
    while i < len(data):
        if i + 1 < len(data) and data[i + 1] == "=>":
            new_data.append(data[i] + data[i+1] + data[i+2])
            i += 3
        else:
            new_data.append(data[i])
            i += 1
    

    【讨论】:

      【解决方案4】:

      下面是我的小实验,我添加了一个函数来调用。你可以检查一下:

      data = ['a34b3f8b22783cf748d8ec99b651ddf35204d40c',
                  'baa6cb4298d90db1c375c63ee28733eb144b7266',
                  'CommitTest.txt',
                  '=>',
                  'text/CommitTest.txt',
                  '0',
                  'README.md',
                  '=>',
                  'text/README.md',
                  '0']
      
      
      def convert_list():
          ind = [i for i, x in enumerate(data) if x == "=>"]
      
          if ind == 0 or ind == len(data) - 1:
              print("Invalid element location")
              return
      
          new_data = []
      
          index_start = 0
          while index_start < len(data):
              for ind_index in ind:
                  if index_start == ind_index -1:
                      index_start += 3
                      new_data.append(data[ind_index - 1] + data[ind_index] +data[ind_index + 1])
      
                  new_data.append(data[index_start])
                  index_start += 1
      
          return new_data
      
      print(convert_list())
      

      【讨论】:

        【解决方案5】:

        需要删除的索引先保存,后删除。

        delete_index=[]
        for i,d in enumerate(data):
            if(d=="=>"):
                data[i]=data[i-1]+data[i]+data[i+1]
                delete_index.append(i-1)
                delete_index.append(i+1)
        new_data=[]
        for i,d in enumerate(data):
            if i not in delete_index:
                new_data.append(d)
        print(new_data)
        

        【讨论】:

          猜你喜欢
          • 2019-02-20
          • 2011-02-04
          • 2018-08-18
          • 2021-02-19
          • 1970-01-01
          • 1970-01-01
          • 2023-04-02
          • 2013-06-22
          • 2019-07-04
          相关资源
          最近更新 更多