Как удалить все целочисленные значения из списка в Python

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

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

После удаления я хочу, чтобы документ был похож:

['introduction','to','molecular','the','learning','module']
9
задан SilentGhost 1 July 2010 в 15:29
поделиться

6 ответов

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

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)
26
ответ дан 4 December 2019 в 05:57
поделиться

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

11
ответ дан 4 December 2019 в 05:57
поделиться

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

0
ответ дан 4 December 2019 в 05:57
поделиться

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

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)

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

4
ответ дан 4 December 2019 в 05:57
поделиться

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

1
ответ дан 4 December 2019 в 05:57
поделиться

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

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

13
ответ дан 4 December 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: