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 )) |
为什么?因为
列表中的所有项都不是整数。它们是只包含数字的字符串。所以您可以使用
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) |
。
您可以使用
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对象都可以合法地转换为字符串,因此在这里,
内置功能非常有用。它们每一个都针对它们设计的任务进行了高度优化,并且可以避免您重新设计解决方案。
请不要使用这种方式从列表中删除项目:(在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所述。