【问题标题】:Insert an element before and after a specific element in a List of strings在字符串列表中的特定元素之前和之后插入一个元素
【发布时间】:2016-03-12 13:32:16
【问题描述】:

是否可以在出现特定字符串时插入列表。 示例:

List=['north','south','east','west','south','united']

因此,每次出现字符串 'south' 时,列表都会在列表中的元素 south 之前插入一个项目 'canada'

Results
List=['north','canada','south','east','west','canada','south','united']

编辑:我为不够具体而道歉。我需要它来寻找特定的字符。

List1=['north','<usa>23<\usa>','east','west','<usa>1942<\usa>','united']
Result=['north','canada', '<usa>23<\usa>','east','west','canada','<usa>1942<\usa>','united']

【问题讨论】:

  • 您正在寻找insert,而不是appendthis question 可能会有所帮助,但您必须在列表遍历中添加条件语句
  • 您确定是&lt;\usa&gt; 而不是&lt;/usa&gt;

标签: python list iteration


【解决方案1】:

在另一个元素之前插入元素

>>> x = [1,2,3,4,5]
>>> x.insert(x.index(4), 22)
>>> x
[1, 2, 3, 22, 4, 5]

一个接一个地插入元素

>>> x = [1,2,3,4,5]
>>> x.insert(x.index(3)+1, 22)
>>> x
[1, 2, 3, 22, 4, 5]

但是,这不适用于多次插入

>>> x = [1,2,3,4,5,4,6,4,7]
>>> x.insert(x.index(4), 22)
>>> x
[1, 2, 3, 22, 4, 5, 4, 6, 4, 7]

【讨论】:

    【解决方案2】:

    简单的答案:

    def blame_canada(old_list): 
        new_list = []
        for each in old_list:
            if each == 'south':
                new_list.append('canada')
            new_list.append(each)
        return new_list
    

    【讨论】:

    • 不需要else;您将在任一分支中附加 each,因此使其成为无条件的。
    【解决方案3】:

    使用简单的循环:

    L = ['north','south','east','west','south','united']
    res = []
    for entry in L:
        if entry == 'south':
            res.append('canada')
        res.append(entry)
    L[:] = res
    

    最后一行将结果复制到原始列表中。这使它等同于修改原始列表的append。使用大量 insert 调用会使大型列表变得非常慢,因为它需要为每个插入构建整个列表。

    【讨论】:

    • 我没有详细说明,但我明白这一点,我正在查看它是否包含这些字母。然后我会追加,因为在我的实际列表中,搜索元素会附加数字。
    【解决方案4】:

    这是一种执行此操作的高性能列表理解方法。

    首先,它生成一个包含“south”的索引列表。

    然后,它使用索引 + 索引顺序作为插入点(以考虑循​​环中先前的插入),从而为这个问题提供了一个简单、快速且易于遵循的 Python 解决方案:

    List = ['north','south','east','west','south','united']
    souths = [idx for idx, val in enumerate(List) if val == 'south']
    for i, idx in enumerate(souths):
        List.insert(idx+i, 'canada')
    

    【讨论】:

    • 是什么让您称之为高性能?您是否进行了计时测试,或者您只是认为它是高性能的?
    • @dwanderson 您无需对其进行测试即可知道计算复杂度约为 O(1.25n)。
    【解决方案5】:

    您可以使用双列表理解(使用List,就像您定义的那样)使用简单的单行:

    >>> [inner for outer in [(['canada',x] if x == 'south' else [x]) for x in List] for inner in outer]
    ['north', 'canada', 'south', 'east', 'west', 'canada', 'south', 'united']
    

    答案由两部分组成:

    • 内部列表理解:[(['canada',x] if x == 'south' else [x]) for x in List] 这会遍历列表并返回列表列表。如果x 是南,它发出['canada','south'],否则它发出[x]。所以结果是这样的:

      >>> [(['canada',x] if x == 'south' else [x]) for x in List]
      [['north'], ['canada', 'south'], ['east'], ['west'], ['canada', 'south'], ['united']]
      

      对于给定的列表。

    • 接下来使用this approach将结果展平。

    【讨论】:

      【解决方案6】:

      为了能够在列表中的特定位置放置元素,您需要列出insert 函数。

      <list>.insert(<position>, <value>)
      

      例如,如果您有一个包含以下内容的列表:

      a = [2, 4, 6, 8, 12]
      

      并且想在列表中添加10但保持当前顺序,你可以这样做:

      a.insert(4, 10)
      

      会得到:

      [2, 4, 6, 8, 10, 12]
      

      编辑

      在每个“南”之前插入:

      for i in range(len(<list>)):
          if <list>[i] == 'south':
              <list>.insert(i, 'canada')
      

      【讨论】:

      • 这并不能真正回答我认为的问题?
      • 我了解插入功能,但我如何在每个说“南”的元素之前将一个新元素插入到我的列表中
      • 您认为循环for i in range(len(..)) 真的可行吗?我认为您应该倒退,不要移动尚未处理的项目。另外使用enumerate() 会很好。
      猜你喜欢
      • 1970-01-01
      • 2017-01-15
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-17
      • 2015-09-11
      • 1970-01-01
      相关资源
      最近更新 更多