Как удалить все целочисленные значения из списка в Python - PullRequest
8 голосов
/ 01 июля 2010

Я только начинающий в Python, и я хочу знать, возможно ли удалить все целочисленные значения из списка?Например, документ выглядит так:

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

После удаления я хочу, чтобы документ выглядел следующим образом:

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

Ответы [ 8 ]

25 голосов
/ 01 июля 2010

Чтобы удалить все целые числа, сделайте это:

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)
13 голосов
/ 01 июля 2010

Вы тоже можете сделать это:

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 лучше, чем пытаться писать правила или регулярные выражения для распознавания строковых значений, которые кодируют целое число.

10 голосов
/ 01 июля 2010

Ни один из элементов в вашем списке не является целым числом. Это строки, которые содержат только цифры. Таким образом, вы можете использовать строковый метод 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

4 голосов
/ 01 июля 2010

Мне лично нравится фильтр. Я думаю, что это может помочь сделать код читабельным и концептуально простым, если использовать его разумно:

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)

Обратите внимание, что второй возвращает итератор.

1 голос
/ 01 июля 2010

Вы также можете использовать лямбды (и, очевидно, рекурсию) для достижения этого (необходим 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') будет: ['hello', 'world']

0 голосов
/ 01 марта 2017

Чтобы удалить все целые числа из списка

ls = ['1','introduction','to','molecular','8','the','learning','module','5']
ls_alpha = [i for i in ls if not i.isdigit()]
print(ls_alpha)
0 голосов
/ 20 января 2013

Вы можете использовать встроенный filter для получения отфильтрованной копии списка.

>>> 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 берет str-конвертированную копию для каждого члена the_list и проверяет, является ли строка (без любого начального символа '-') числовой цифрой. Если это так, участник исключается из возвращенной копии.

Встроенные функции очень полезны. Каждая из них высоко оптимизирована для задач, для решения которых она предназначена, и она избавит вас от переизобретения решений.

0 голосов
/ 01 июля 2010

Пожалуйста, не используйте этот способ для удаления элементов из списка: (отредактировано после комментария 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...