关于字符串:如何从python中的列表中删除所有整数值

How to remove all integer values from a list in python

我只是Python的初学者,我想知道是否可以从列表中删除所有整数值?例如,文档如下

1
['1','introduction','to','molecular','8','the','learning','module','5']

删除后,我希望文档看起来像:

1
['introduction','to','molecular','the','learning','module']


要删除所有整数,请执行以下操作:

1
no_integers = [x for x in mylist if not isinstance(x, int)]

但是,示例列表实际上不包含整数。它只包含字符串,其中一些字符串仅由数字组成。要过滤掉这些内容,请执行以下操作:

1
2
no_integers = [x for x in mylist if not (x.isdigit()
                                         or x[0] == '-' and x[1:].isdigit())]

或者:

1
2
is_integer = lambda s: s.isdigit() or (x[0] == '-' and x[1:].isdigit())
no_integers = filter(is_integer, mylist)


你也可以这样做:

1
2
3
4
5
6
7
8
9
def int_filter( someList ):
    for v in someList:
        try:
            int(v)
            continue # Skip these
        except ValueError:
            yield v # Keep these

list( int_filter( items ))

为什么?因为int比试图编写规则或正则表达式来识别编码整数的字符串值要好。


列表中的所有项都不是整数。它们是只包含数字的字符串。所以您可以使用isdigit字符串方法过滤掉这些项。

1
2
3
4
5
items = ['1','introduction','to','molecular','8','the','learning','module','5']

new_items = [item for item in items if not item.isdigit()]

print new_items

文档链接:http://docs.python.org/library/stdtypes.html_str.isdigit


我个人喜欢过滤器。我认为,如果以明智的方式使用,它可以帮助保持代码可读性和概念简单:

1
2
x = ['1','introduction','to','molecular','8','the','learning','module','5']
x = filter(lambda i: not str.isdigit(i), x)

1
2
from itertools import ifilterfalse
x = ifilterfalse(str.isdigit, x)

注意,第二个返回迭代器。


您还可以使用lambda(显然还有递归)来实现这一点(需要使用python 3):

1
2
3
4
5
6
7
8
 isNumber = lambda s: False if ( not( s[0].isdigit() ) and s[0]!='+' and s[0]!='-' ) else isNumberBody( s[ 1:] )

 isNumberBody = lambda s: True if len( s ) == 0 else ( False if ( not( s[0].isdigit() ) and s[0]!='.' ) else isNumberBody( s[ 1:] ) )

 removeNumbers = lambda s: [] if len( s ) == 0 else ( ( [s[0]] + removeNumbers(s[1:]) ) if ( not( isInteger( s[0] ) ) ) else [] + removeNumbers( s[ 1:] ) )

 l = removeNumbers(["hello","-1","2","world","+23.45"])
 print( l )

结果(从"l"显示)将为:【hello'、【world'】


从列表中删除所有整数

1
2
3
ls = ['1','introduction','to','molecular','8','the','learning','module','5']
ls_alpha = [i for i in ls if not i.isdigit()]
print(ls_alpha)


您可以使用filter内置来获取列表的过滤副本。

1
2
3
4
>>> the_list = ['1','introduction','to','molecular',-8,'the','learning','module',5L]
>>> the_list = filter(lambda s: not str(s).lstrip('-').isdigit(), the_list)
>>> the_list
['introduction', 'to', 'molecular', 'the', 'learning', 'module']

上面可以使用显式类型转换来处理各种对象。由于几乎每个python对象都可以合法地转换为字符串,因此在这里,filter为"u"列表的每个成员获取一个str转换副本,并检查字符串(减去任何前导的"-"字符)是否是数字。如果是,则从返回的副本中排除该成员。

内置功能非常有用。它们每一个都针对它们设计的任务进行了高度优化,并且可以避免您重新设计解决方案。


请不要使用这种方式从列表中删除项目:(在thc4k评论后编辑)

1
2
3
4
5
6
7
>>> li = ['1','introduction','to','molecular','8','the','learning','module','5']
>>> for item in li:
        if item.isdigit():
            li.remove(item)

>>> print li
['introduction', 'to', 'molecular', 'the', 'learning', 'module']

这将不起作用,因为在迭代过程中更改列表会混淆for循环。此外,如果项是包含负整数的字符串,则item.isdigit()将不起作用,如razpeitia所述。