如何除了所选值外,从字符串中删除所有值

8

我的代码如下: value = "123456" 我想要去除除了2和5以外的所有数字。输出应该是25。 即使改变value的值,程序也应该可以工作。例如: value = "463312" 输出结果应该是2。

我尝试使用remove()replace()函数,但它们都没有奏效。 这是在Python 3.6.2上操作。

6个回答

11

不要试图移除每个不想要的字符,相比之下,建立一个白名单,列出你想在结果中保留的字符会更加有效:

>>> value = '123456'
>>> whitelist = set('25')
>>> ''.join([c for c in value if c in whitelist])
'25'

这里还有一种隐式循环的选项。我们构建一个映射表,用于与 str.translate 一起使用,其中每个字符都映射到 '',除非另有说明:

>>> from collections import defaultdict
>>> d = defaultdict(str, str.maketrans('25', '25'))
>>> '123456'.translate(d)
'25'

有没有办法使用if elif,例如如果value == 2或value == 5,则返回""? - dipte
有没有使用正则表达式的解决方案? - MD. Khairul Basar
1
@MD.KhairulBasar,如果你正在寻找一个正则表达式的解决方案,请查看我的答案。 - Bharath M Shetty
由于OP正在使用Python 3,如果去掉方括号“[]”,速度会更快。不确定Python 2是否支持单个未加括号的生成器推导式。 - Enrico Borba
1
@EnricoBorba 这是不正确的。使用中间列表推导实际上更快,因为生成器版本会添加一些不必要的开销。如果你不相信我,请自己测试时间。 - wim
@wim 你说得对!我刚刚计时了一下。我真的不知道这个。看起来中间列表甚至对于大字符串来说都更好。非常奇怪。 - Enrico Borba

9
如果您正在寻找正则表达式的解决方案,可以使用 re.sub 将除了 25 之外的所有字符替换为 ''
import re
x = "463312"
new = re.sub('[^25]+' ,'', x)
x = "463532312"
new = re.sub('[^25]+' ,'', x)

输出: 2522

2
如果您使用的是Python 2,您可以像这样使用filter:
In [60]: value = "123456"

In [61]: whitelist = set("25")

In [62]: filter(lambda x: x in whitelist, value)
Out[62]: '25'

如果您正在使用Python 3,则需要对过滤器的结果进行"".join()操作。

;P和我的答案差不多。不过,我不知道你不需要将字符串转换为list() - Jerrybibo
你不需要这样做,这就是为什么在这种情况下过滤器很有吸引力的原因。;) - Akavall
你不需要使用 str.join 来处理结果吗?在 Python 3 中,filter 只会返回一个惰性的 filter 对象。 - Graipher
@Akavall 这个回答假设使用的是Python2,这是一个不好的假设。 - cs95
谢谢,我已经更新了我的答案。 - Akavall

0
value="23456"
j=""
for k in value:
    if k=='2' or k=='5':
        j=j+k
print (j)

这是你所说的程序,您可以为该值提供任何输入,它将始终打印25。


1
它不起作用。你有运行吗? - MD. Khairul Basar
@MD.Khairul Basar 我之前弄错了,但现在我已经编辑好了,它可以正常工作了... 你试试看。 - Akash Tyagi
@MD.KhairulBasar 如果你尝试过这个并且它有效,请回复。 - Akash Tyagi
是的,现在它可以工作了。但是OP不能使用for循环。请阅读评论。 - MD. Khairul Basar

0

我尝试使用Python内置的filter()方法和lambda来不同地处理这个问题。见下方:

a = "1225866125" # Should return "22525"
whitelist = '25'

# Use filter to remove all elements that does not match the condition
a = "".join(filter(lambda c: c in whitelist, a))

希望这有所帮助!
(编辑以缩短答案,感谢@Akavall和再次感谢@salparadise)

whitelist = '25' 也可以,不需要元组。 - salparadise
将“白名单”设置为“集合”会更快(适用于大型白名单)。 - Graipher

0
value = "123456"

whitelist = '25'

''.join(set(whitelist) & set(value))
'25'

2
如果 value="1122355",它能工作吗? - MD. Khairul Basar
@MD.KhairulBasar 定义 'work' 是什么? - salparadise
如果 value="1122355",它会输出 2255 吗? - MD. Khairul Basar
@MD.KhairulBasar 我没有在问题中看到那个要求。 - salparadise
@salparadise:“我想除了2和5之外的所有东西都删掉。”你认为这是什么意思? - Jerrybibo
此外,集合是无序的,因此您可能会得到2和5的任何顺序。 - Akavall

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