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

 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() ]

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

1
Steve 27 Июн 2019 в 11:21

4 ответа

Лучший ответ

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

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 имеет значение true, если и только если x и y являются одним и тем же объектом. Идентификация объекта определяется с помощью функции id (). x is not y возвращает значение обратной истинности.

Он попытался выяснить, не является ли token (какая-то строка) не token.isdigit() (что-то логическое), это, конечно, верно для всех токенов :)

2
Adam.Er8 27 Июн 2019 в 08:41

В вашем коде вы сравниваете 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 из вашего кода, и все будет хорошо.

1
Piotr Kamoda 27 Июн 2019 в 08:44

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

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

Проверь это.

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

1
Meet Maheshwari 27 Июн 2019 в 08:37

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

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
Stan S. 27 Июн 2019 в 08:52