Извлечение 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 функция.

Другие вопросы по тегам