Извлечение 8-значных чисел из списка строк
У меня есть список строк, которые могут содержать буквы, символы, цифры и т. Д., Как показано ниже:
list = ['\n', '', '0', '38059', '', '', '?_', '71229366', '', '1', '38059', '', '', '?_', '87640804', '', '2', '38059', '', '', '?_', '71758011', '', '', ':?', ';__', '71229366287640804271758011287169822']
Как отфильтровать все остальные строки, кроме чисел меньше 10000000 и больше 99999999?
Ожидаемый результат:
list = ['71229366', '87640804', '71758011']
5 ответов
Вы можете использовать map
а также filter
,
your_list = ['\n', '', '0', '38059', '', '', '?_', '71229366', '', '1', '38059',
'', '', '?_', '87640804', '', '2', '38059', '', '', '?_', '71758011',
'', '', ':?', ';__', '71229366287640804271758011287169822']
new_list = list(map(int, filter(lambda x: x.isdigit() and 10000000 < int(x) < 99999999, your_list)))
print(new_list)
list()
опционально на python2.
Выход:
[71229366, 87640804, 71758011]
Если вы не хотите конвертировать в целое число, отбросьте map
:
>>> list(filter(lambda x: x.isdigit() and 10000000 < int(x) < 99999999, your_list))
['71229366', '87640804', '71758011']
Если вы не против создать новый список, вы можете попробовать что-то с помощью простого понимания списка, как
filtered_list = [i for i in list if i.isdigit() and 10000000 < int(i) < 99999999]
data = ['\n', '', '0', '38059', '', '', '?_', '71229366', '', '1', '38059',
'', '', '?_', '87640804', '', '2', '38059', '', '', '?_', '71758011',
'', '', ':?', ';__', '71229366287640804271758011287169822']
res = []
for e in data:
try:
number = int(e)
except ValueError:
continue
if 10000000 < number < 99999999:
res.append(str(number))
печать (разрешение)
print(res)
Выход:
['71229366', '87640804', '71758011']
def valid(v):
try:
value = int(v)
return 10000000 <= value <= 99999999
except:
return False
output = [x for x in list if valid(x)]
Пояснение:
Отфильтруйте все значения в списке, используя действующую функцию в качестве критерия.
Позвольте мне дать простой и эффективный ответ, используя регулярные выражения. Там нет необходимости map
(дублируя исходный список), или преобразовать все в int
s; в основном вы спрашиваете, как сохранить все 8-значные целые числа в вашем списке:
>>> filter(re.compile('^\d{8}$').match, data)
['71229366', '87640804', '71758011']
Мы compile
регулярное выражение, которое соответствует ровно 8 цифрам, а затем фильтрует список, предоставляя частичное применение regex.match
к стандарту filter
функция.