遍历时从字符串列表中删除元素

时间:2019-05-30 18:18:21

标签: python python-3.x list

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

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']

whis不是预期的输出。请帮助

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

3 个答案:

答案 0 :(得分: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']

答案 1 :(得分:2)

格林披风家伙所说的基本上是正确的。编辑列表的大小(通过调用.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 :(得分:2)

认为此列表理解有效(尚未看到如何处理%的示例):

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

想法是:

  • 列出元素及其后继元素的配对列表
  • 过滤掉应删除的元素
  • 根据需要保留后继者