从字符串列表中删除字符

35

如果我有一个字符串列表,例如:

[("aaaa8"),("bb8"),("ccc8"),("dddddd8")...]

我该怎么做才能摆脱每个字符串中的所有8? 我尝试在for循环中使用stripreplace,但它不像在普通字符串中一样有效(不在列表中)。 有人有建议吗?


3
顺便提一句,你的列表中不需要括号。除非我漏看了什么,写成lst = ["aaaa8", "bb8", "ccc8", "dddddd8"]同样正确(而且在这种情况下,我认为更容易理解)。 - Philip Uren
1
为了帮助您更好地学习,也许您应该展示您的代码,这样我们就可以评论为什么它没有按您预期的那样工作。 - poke
6个回答

78

试试这个:

lst = [("aaaa8"),("bb8"),("ccc8"),("dddddd8")]
print([s.strip('8') for s in lst]) # remove the 8 from the string borders
print([s.replace('8', '') for s in lst]) # remove all the 8s 

他可能不想破坏他的数据结构,你用你的语句得到的是字符串列表,但如果原来是元组的话,难道你不应该用 (s.strip('8'),) 替换 s.strip('8') 吗? - Jan Vorcak
7
不,原始列表不是元组列表,而是字符串列表。正如您自己所写的那样,通过(x,)可以创建一个一元组,而不仅仅是(x) - poke
s.strip()在列表推导式中正是我所需要的。谢谢@jochen! - Amir

12

除了使用循环和 for 推导式之外,您还可以使用 map。

lst = [("aaaa8"),("bb8"),("ccc8"),("dddddd8")]
mylst = map(lambda each:each.strip("8"), lst)
print mylst

6
请注意,在Python 3中,map函数返回一个映射对象,需要先将其转换为列表。 - poke
我还没有机会尝试Python 3,因为我有很多依赖于Python 2的库。想想看,我猜我可能会在新项目中迁移到Python 3。 - Tg.

5
更快的方法是将列表连接起来,替换8并拆分新字符串:
mylist = [("aaaa8"),("bb8"),("ccc8"),("dddddd8")]
mylist = ' '.join(mylist).replace('8','').split()
print mylist

这种方式无法处理单词结尾不止一个 '8' 的情况(例如 "xxx8xx8"),而要求删除最右边的 '8'。 - Gino Mempin

1
mylist = [("aaaa8"),("bb8"),("ccc8"),("dddddd8")]
print mylist
j=0
for i in mylist:
    mylist[j]=i.rstrip("8")
    j+=1
print mylist

3
这不符合Python风格! - java_mouse
2
True @java_mouse提供了一个Pythonic的替代方法,而不仅仅是说这个方法行不通,这是我们大多数人都知道的。 - itsmrbeltre

1

这是一个使用正则表达式的简短单行代码:

print [re.compile(r"8").sub("", m) for m in mylist]

如果我们将正则表达式操作分开并改进命名:
pattern = re.compile(r"8") # Create the regular expression to match
res = [pattern.sub("", match) for match in mylist] # Remove match on each element
print res

-2
lst = [("aaaa8"),("bb8"),("ccc8"),("dddddd8")...]

msg = filter(lambda x : x != "8", lst)

print msg

编辑: 对于任何看到这篇文章的人,以上代码会从列表中删除所有等于8的元素。

假设我们使用上面的例子,第一个元素(“aaaaa8”)不等于8,因此它将被删除。

为了使这个问题的意图得以实现,我们可以执行类似于以下内容的操作

msg = filter(lambda x: x != "8", map(lambda y: list(y), lst))
  • 我现在不在解释器中, 所以当然结果可能会有变化,我们可能需要索引,因此对于这个解释目的,我们只需要以list(y[0])进行修改。

这样做的作用是将列表的每个元素拆分成一个字符数组,所以("aaaa8")将变为["a", "a", "a", "a", "8"]。

这将导致一个数据类型,看起来像这样

msg = [["a", "a", "a", "a"], ["b", "b"]...]

最后,我们需要将它们映射回大致相同的类型以进行包装。

msg = list(map(lambda q: ''.join(q), filter(lambda x: x != "8", map(lambda y: list(y[0]), lst))))

我绝对不建议这样做,但如果你真的想尝试使用map和filter玩一下,我认为你可以用一行代码完成。


对于任何看到这篇文章的人,以上代码会从列表中删除所有等于8的元素。假设我们使用上面的例子,第一个元素("aaaaa8")不等于8,因此它将被删除。为了使这个问题的意图得以实现,我们可以执行类似于以下代码:msg = filter(lambda x: x != "8", map(lambda y: list(y), lst))这将把列表中的每个元素拆分成字符数组,因此("aaaa8")将变成["a", "a", "a", "a", "8"]。 - onaclov2000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接