используя одну строку, чтобы отфильтровать цифры из строки Python - PullRequest
1 голос
/ 27 июня 2019

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

 string = "these 5 sentences should not have 2 numbers in them"
 newString = []
 for token in string.split():
     if token.isdigit() == False:
         newString.append(token)
 newString = " ".join(newString)
 print(newString)

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

   newString = [token for token in string.split() if token is not 
   token.isdigit() ]

Но, похоже, это не улавливает цифры.Почему лямбда-выражение не работает?

Ответы [ 5 ]

2 голосов
/ 27 июня 2019

попробуйте это:

string = "these 5 sentences should not have 2 numbers in them"

newString = " ".join(token for token in string.split() if not token.isdigit())

print(newString)

проблема заключалась в использовании is.

, хотя python иногда очень похож на английский, что замечательно, в некоторых случаях он вызывает путаницу:)

is - это оператор сравнения идентификаторов ,

, цитирующий документы:

Операторы is и is not проверка идентичности объекта: x is y истинно тогда и только тогда, когда x и y являются одним и тем же объектом.Идентичность объекта определяется с помощью функции id ().x is not y возвращает значение обратной истинности.

он пытался увидеть, не является ли token (который является некоторой строкой) не token.isdigit() (который является некоторым логическим значением), это, конечно, верно длявсе токены:)

1 голос
/ 27 июня 2019

Что-то вроде:

newstring = ''.join(map(lambda x: x if not x.isdigit() else "", string.split() ))

точно с пробелами:

newstring = ' '.join(map(lambda x: x if not x.isdigit() else "", string.split() )).replace('  ', ' ')
1 голос
/ 27 июня 2019

Этот код работает, я только что попробовал.

newString = " ".join([x for x in string.split() if x.isdigit() == False])

Проверьте это.

Все вещи только в одной строке кода.

1 голос
/ 27 июня 2019

В вашем коде вы сравниваете token и token.isdigit() с оператором is not.Он сравнивает объекты, если они являются одним и тем же объектом, но string и boolean даже не относятся к одному и тому же типу, поэтому результат всегда верен:

>>> string = "these 5 sentences should not have 2 numbers in them"
>>> string.split()
['these', '5', 'sentences', 'should', 'not', 'have', '2', 'numbers', 'in', 'them']
>>> token = string.split()[3]
>>> token
'should'
>>> token.isdigit()
False
>>> token is not token.isdigit()
True
>>> token = string.split()[1]
>>> token
'5'
>>> token is not token.isdigit()
True

Так что вам нужно просто удалить token is из вашегокод, и это должно быть хорошо.

0 голосов
/ 27 июня 2019

Мне кажется, в вашем лямбда-выражении есть небольшая ошибка.
Попытка:

newString = [token for token in string.split() if not token.isdigit()]

Конечно, newString теперь список, но я надеюсь, что это отвечает на ваш оригинальный вопрос.

...