Как проверить, сколько строк начинается с цифры

57
9

Предположим, что строка " text " представляет несколько строк, как я могу подсчитать, сколько строк начинается с цифры?

def digit_leading_lines(text):
n = 0
newlist = text.split()
for i in range (len(newlist)):
for j in range (len(newlist[i])):
if newlist[i][j].isdigit() == True:
n += 1
return n

Как только я тестирую его с текстом = " AAA\n1st ", он дает правильный вывод как 1. Но когда я \t4G\nHz\n текст = " \t4G\nHz\n ", которые вызывают начало первой строки с вкладкой, а вывод должен быть 0 Однако он все равно дает мне 1 как результат.

И когда я тестирую " 0\n0 3\n\n ", это дает мне неправильный вывод 3. Спасибо за любую помощь.

спросил(а) 2016-03-20T16:29:00+03:00 4 года, 3 месяца назад
1
Решение
87

Решение:

def digit_leading_lines(text):
lines = text.splitlines()
count = 0
for line in lines:
if line and line[0].isdigit():
count += 1
return count

ответил(а) 2016-03-20T16:34:00+03:00 4 года, 3 месяца назад
67

Почему ваш код не работает

Это потому, что вы перебираете каждый символ в каждой строке. Ваш вывод имеет смысл, потому что он просто подсчитывает количество цифр в файле, а не строки, начинающиеся с цифры.

Заставляя его работать

Есть много возможных решений для вашей проблемы, прямое решение будет повторяться на линиях и проверять только первый символ в каждой строке:

with open('file') as f:
lines = f.readlines()
for line in lines:
# check if the first character is a digit
# and increment the count

Совет для жизни: всегда отлаживайте свой код, чтобы лучше понять его поток

ответил(а) 2016-03-20T16:35:00+03:00 4 года, 3 месяца назад
39

Python позволяет вам делать именно то, что вы хотите: суммировать все строки, где первая буква - это цифра. Вы можете использовать тот факт, что False или пустая строка имеет значение 1 в числовом контексте и суммируют:

sum(
(line and line[0]).isdigit()
for line in text.splitlines()
)

вам нужно (line and line[0]) чтобы избежать IndexError когда строка пуста, и в этом случае возвращается первое значение фальши (пустая строка), которое не является цифрой, поэтому возвращает False.

ответил(а) 2016-03-20T17:43:00+03:00 4 года, 3 месяца назад
39

Попробуйте этот фрагмент кода с помощью regex:

data = """
The volcano is covered by a thick ice cap,
one of the largest in the tropics,
5 that has existed since at least the Pliocene and has
3 undergone several phases of expansion and reduction. As of
2016, the ice cap is in retreat; one estimate predicts that
it will disappear by
2045. The retreat of the Coropuna glaciers threatens the water
supply of tens of thousands of people,
and interaction between volcanic activity and glacial effects has
45 generated mudflows that could be a hazard to surrounding populations
if the mountain returns to volcanic activity.
"""

rx = re.compile(r"^\d", re.IGNORECASE | re.DOTALL | re.MULTILINE)

count = 0
for match in rx.finditer(data):
count += 1

print(count)

Выход: 5

Где data содержат многострочный текст.

ответил(а) 2016-03-20T16:42:00+03:00 4 года, 3 месяца назад
39

Вы можете вызвать метод split с параметром '\n', чтобы он разбивался только на основе новой строки. И тогда вы можете упростить проверку числовых значений, как в приведенном ниже коде.

def digit_leading_lines(text):
n = 0
newlist = text.split('\n')
for l in newlist:
if len(l) and l[0].isdigit():
n += 1
return n

print digit_leading_lines("\t4G\nHz\n")

ответил(а) 2016-03-20T16:36:00+03:00 4 года, 3 месяца назад
39

Вы используете .split() который извлекает все пробелы. Вместо этого используйте .splitlines(). Кроме того, вы можете сделать это с помощью выражения генератора:

def digit_leading_lines(text):
return sum(1 for line in text.splitlines() if line and line[0].isdigit())

ответил(а) 2016-03-20T16:35:00+03:00 4 года, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема