【问题标题】:Replacing element in list with multiple elements [duplicate]用多个元素替换列表中的元素[重复]
【发布时间】:2018-11-17 22:46:37
【问题描述】:

我想用多个元素替换列表中的一个元素。例如,我有列表 a = ['b', 'c'] 并想用 'd', 'e' 替换 'b',这将给我列表 a = ['d', 'e', 'c']

我有以下代码:a = [??? if item == 'b' else item for item in a]。我该如何进行?例如,我希望保留列表理解,因为这似乎比 a.extend(('b', 'c')) 更合适。

【问题讨论】:

  • 单独的列表推导是行不通的,它不能生成一个包含比输入更多的项目的列表。
  • 很多人会说创建嵌套列表并将它们展平,但我实际上认为带有 list.extend 的常规 for 循环可以更多惯用
  • 这里最惯用的可能是运行速度最快的。在列表理解中创建列表只是为了能够提供 1 个或多个元素肯定会浪费 CPU 时间
  • @Jean-FrançoisFabre 这可能值得一个单独的问答和一个不错的基准,或者问题可能已经存在?这不太成功stackoverflow.com/questions/3899645/…
  • 如果这样做我不会感到惊讶。

标签: python python-3.x


【解决方案1】:

另一种选择是编写一个生成器函数:

def replace_item(the_list):
    for item in the_list:
        if item == 'b':
            yield 'd'
            yield 'e'
        else:
            yield item
>>> list(replace_item(['a', 'b']))
['a', 'd', 'e']

【讨论】:

    【解决方案2】:

    也许您可以创建一个二维列表,然后使用itertools.chain 将其展平:

    from itertools import chain
    
    a = ['b', 'c']
    a = list(chain.from_iterable(['d', 'e'] if item == 'b' else [item] for item in a))
    
    print(a)
    # ['d', 'e', 'c']
    

    【讨论】:

    • [y for x in [['d','e'] if item == 'b' else [item] for item in a] for y in x] 我想回答。但都是一样的
    • 您可以将生成器推导而不是列表推导传递给“链”
    • @Jean-FrançoisFabre 谢谢;已更新。
    【解决方案3】:

    另一种方法:

    >>> v = ['b', 'c']
    >>> v = [a for b in v for a in (['d', 'e'] if b == 'b' else [b])]
    >>> v
    ['d', 'e', 'c']
    

    您可以轻松地将其推广到多个替换:

    >>> v = ['b', 'c']
    >>> rep = {'b': ['d', 'e']}
    >>> v = [a for b in v for a in rep.get(b, [b])]
    >>> v
    ['d', 'e', 'c']
    

    【讨论】:

      【解决方案4】:

      您可以使用切片语法将多个元素替换为另一个元素:

      a = 'a b c d b e'.split()
      for i, item in list(enumerate(a))[::-1]:  # makes and copy and reverse it (IMPORTANT!)
          if item == 'b':
              a[i:i+1] = ['d', 'e']
      print(a)
      

      ['a', 'd', 'e', 'c', 'd', 'd', 'e', 'e']

      反转部分是重要的,因为每次替换都会使列表更长,当向后迭代时,索引应该保持有效。

      【讨论】:

      • 您可能想解释一下为什么倒车如此重要。
      【解决方案5】:
      def insert_in_list(a, item_to_replace, list_to_insert):
          try:
              index = a.index(item_to_replace)
          except ValueError: #if item is not in list
              return a
          a[index] = list_to_insert[0]
          for i in list_to_insert[1:]:
              a.insert(index + 1, i)
          return a
      

      有点长,不知道有没有更好的插入方式。

      【讨论】:

      • 当您尝试调用该列表时,应该是list_to_insert[0],而不是list_to_insert(1) 给出错误。此外,insert_in_list(['b', 'c'], 'b', ['e', 'f', 'g', 'h']) 返回['e', 'h', 'g', 'f', 'c']:插入列表的顺序颠倒了。此外,如果要替换的值的实例不止一个,这将失败。
      猜你喜欢
      • 2021-03-03
      • 2021-05-19
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 2023-01-10
      相关资源
      最近更新 更多