【问题标题】:remove elements from list of strings while traversing [duplicate]遍历时从字符串列表中删除元素[重复]
【发布时间】:2019-10-16 10:12:27
【问题描述】:

如何在遍历字符串列表时从字符串列表中删除元素。 我有一个清单

list1 = ['', '$', '32,324', '$', '32', '$', '(35', ')', '$', '32,321']

我想从列表中删除 $,如果出现 ))%% 将其添加到列表的前一个元素中。
预期输出是:

['', '32,324', '32', '(35)', '32,321']

我试过的是

for j,element in enumerate(list1):
   if element == '%' or element == ")%" or element ==')':
      list1[j-1] = list1[j-1] + element
      list1.pop(j)
   elif element == '$':
      list1.pop(j)

但我得到的输出是

['', '32,324', '32', '(35)', '$', '32,321']

这不是预期的输出。请帮忙

这个问题与建议的参考不同,这里如果当前元素是))%%,我必须与前一个元素进行连接。

【问题讨论】:

  • 将你想要的元素复制到一个新列表中可能会更容易,而不是尝试过滤它并同时遍历它。
  • ["(3", "$", ")"] 的输出呢?
  • @LanteDellarovere,这也应该连接到第一个元素,最后两个应该被删除,输出:`["(3$)"]
  • 为什么"$" 包含在输出中?
  • 在我发布答案前几秒钟,问题已被搁置。 Here 是不用克隆列表的代码,检查一下。

标签: python python-3.x list


【解决方案1】:

绿斗篷人说的基本正确。编辑列表的大小(通过调用.pop())会导致您获得意外的j 值。对我来说,在保留现有代码的同时解决此问题的最简单方法是简单地不改变您的列表,而是建立一个新列表:

new_list = []
for j,element in enumerate(list1):
   if element == '%' or element == ")%" or element ==')':
      ret[len(ret) - 1] += element  # add at the end of the previous element
   elif element != '$':
      new_list.push(element)

但是,我建议您在这里考虑一下您的边缘情况。当列表中的一个 ')' 后跟另一个 ')' 时会发生什么?这可能是您的 if 语句中的一种特殊情况。希望这有帮助!

【讨论】:

  • 关于边缘情况的好电话。
【解决方案2】:

认为这个列表理解有效(还没有看到如何处理 % 的示例):

[ (a+b if b in (')',')%','%') else a) for a,b in zip(list1,list1[1:]+['']) if a not in ('$',')',')%','%')]

这个想法是:

  • 列出元素及其后继元素的配对
  • 过滤掉应该删除的元素
  • 为我们保留的适当添加继任者

【讨论】:

    【解决方案3】:

    与其在列表上迭代时尝试动态删除和合并元素,不如根据这里的条件创建一个新列表。

    list1 = ['', '$', '32,324', '$', '32', '$', '(35', ')', '$', '32,321']
    
    out = []
    for element in list1:
        if element == "$":
            continue #skip if $ present
        elif element in ("%", ")", ")%"):
            out[-1] = out[-1] + element #merge with last element of out so far.
        else:
            out.append(element)
    
    print(out)
    #Output:
    ['', '32,324', '32', '(35)', '32,321']
    

    【讨论】:

    • if element in ("%", ")", ")%"): ... elif element != "$": ... 应该足够了。
    猜你喜欢
    • 2010-11-24
    • 2017-02-08
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多