Предполагая, что в вашем наборе данных нет десятичных значений, и что каждый элемент списка будет содержать только одну строку, одно число на строку.
Если все, что вы после списка, содержащего целые значения всех возрастов, начиная с вашего заполненного списка a
, вы можете просто
import re
t = [re.findall(r'\d+', item[0])[0] for item in a if re.findall(r'\d+', item[0])]
. Это понимание списка выполняет несколько вещей.
Во-первых, поскольку ваш список a
представляет собой список списков из одного элемента, поскольку при переборе каждого элемента мы получаем значение первого (и единственного) элемента в списке, используя item[0]
. Затем мы выполняем операцию регулярного выражения (следовательно, import re
) для этого элемента с шаблоном поиска r'\d+'
, который извлекает только целочисленные значения из каждой строки (Вы можете проверить https://regex101.com/, чтобы поиграться с шаблоны регулярных выражений, чтобы лучше понять, как они работают).
Поскольку re.findall
возвращает список совпадений, и, поскольку кажется, что каждая строка в вашем наборе данных будет содержать только одно совпадение (самое большее), мы просто берем [ 0] индекс полученного списка как выбранное нами значение. Если совпадений нет, re.findall
возвращает пустой список. Поскольку пустые списки имеют значение false, оператор if
в нашем понимании списка предотвратит ошибки индексации строк, в которых нет извлекаемых чисел.
Используя ваш пример, результирующий массив t
будет иметь вид следует:
['23', '42']
Обратите внимание, что пустые строки не включены в окончательный список. Если вы хотите включить их, вы можете просто добавить условие else в наш оператор if следующим образом:
t = [re.findall(r'\d+', item[0])[0] if re.findall(r'\d+', item[0]) else '' for item in a]
это приведет к
['23', '', '42', '', '']
Наконец, если вы хотите преобразовать каждое число (в настоящее время строки) в целочисленные значения, вы могли бы вместо этого написать:
t = [int(re.findall(r'\d+', item[0])[0]) if re.findall(r'\d+', item[0]) else '' for item in a]
, что в конечном итоге приведет к:
[23, '', 42, '', '']
Конечно, все это предполагает, что нет десятичных значения в вашем наборе данных, и что каждый элемент списка будет содержать только одну строку, причем каждая строка содержит только одно требуемое число.
Например, наш re.findall
со строкой «Мне 42 года, и мой son is 16 ", вернул бы ['42', '16'], и поскольку мы возвращаем только первый элемент списка, окончательный список не будет содержать '16'. Помните об этом.
Поскольку мы не создаем никаких дополнительных элементов (например, с помощью str.split()
), мы можем быть уверены, что результирующий список состоит из того же числа элементов (при условии, что мы используем вариант с оператором else ''
). Если мы используем первый вариант, результирующий список будет содержать только столько элементов, сколько есть элементов в a
, содержащих числа.