Я - просто новичок в Python, и я хочу знать, что действительно ли возможно удалить все целочисленные значения из списка? Например, документ идет как
['1','introduction','to','molecular','8','the','learning','module','5']
После удаления я хочу, чтобы документ был похож:
['introduction','to','molecular','the','learning','module']
Чтобы удалить все целые числа, сделайте следующее:
no_integers = [x for x in mylist if not isinstance(x, int)]
Однако ваш примерный список фактически не содержит целых чисел. Он содержит только строки, некоторые из которых состоят только из цифр. Чтобы отфильтровать их, выполните следующие действия:
no_integers = [x for x in mylist if not (x.isdigit()
or x[0] == '-' and x[1:].isdigit())]
Альтернативно:
is_integer = lambda s: s.isdigit() or (x[0] == '-' and x[1:].isdigit())
no_integers = filter(is_integer, mylist)
Ни один из элементов вашего списка не является целым. Это строки, содержащие только цифры. Таким образом, вы можете использовать строковый метод isdigit
, чтобы отфильтровать эти элементы.
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
Пожалуйста, не используйте этот способ для удаления элементов из списка: (отредактировано после комментария THC4k)
>>> 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.
Мне лично нравится фильтр. Я думаю, что он может помочь сохранить код читабельным и концептуально простым, если использовать его разумно:
x = ['1','introduction','to','molecular','8','the','learning','module','5']
x = filter(lambda i: not str.isdigit(i), x)
или
from itertools import ifilterfalse
x = ifilterfalse(str.isdigit, x)
Обратите внимание, что второй возвращает итератор.
Вы также можете использовать лямбды (и, очевидно, рекурсию), чтобы добиться этого (требуется Python 3):
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') будет: [ «привет», «мир»]
Вы тоже можете это сделать:
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
лучше, чем попытки написать правила или регулярные выражения для распознавания строковых значений, которые кодируют целое число.