2015-02-07 2 views
2

Я пытаюсь создать функцию, которая принимает имя файла, и возвращает 2-кортеж с количеством непустых строк в этой программе, а сумма от длин всех этих линий. Вот моя текущая программа:подсчет непустых строк и сумма длин этих строк в python

def code_metric(file): 
    with open(file, 'r') as f: 
     lines = len(list(filter(lambda x: x.strip(), f))) 
     num_chars = sum(map(lambda l: len(re.sub('\s', '', l)), f)) 

    return(lines, num_chars) 

В результате я получаю это получить, если я:

if __name__=="__main__": 
print(code_metric('cmtest.py')) 

является

(3, 0) 

, когда он должен быть:

(3,85) 

Также есть лучший способ найти сумму длины линий с использованием карты функционалов, фильтра и сокращения? Я сделал это для первой части, но не смог понять вторую половину. AM вроде бы новый для python, поэтому любая помощь будет отличной.

Вот тестовый файл называется cmtest.py:

import prompt,math 

x = prompt.for_int('Enter x') 
print(x,'!=',math.factorial(x),sep='') 

First line has 18 characters (including white space) 
Second line has 29 characters 
Third line has 38 characters 

[(1, 18), (1, 29), (1, 38)] 

Отсчет строка 85 символов, включая пробелы. Прошу прощения, я неправильно прочитал проблему. Общая длина для каждой строки также должна содержать пробелы.

+0

Вы уверены, что при подсчете количества символов вы не считаете пробелы в строках? – Aradmey

+0

Вы делаете две итерации (и каждый раз, когда вы открываете файл и перебираете строки), если вы хотите повысить эффективность, почему бы не объединить оба действия в одну итерацию? – alfasin

+0

@ Aradmey- Я довольно уверен в этом. Это только на 1. Вот почему я не могу понять, почему? I – BoJaNgLeS

ответ

2

Довольно простой подход заключается в создании генератора, чтобы лишить конечные пробелы, затем enumerate над этим (с начальным значением, равным 1) filter Инг пустых строк и суммирования длины каждой линии, в свою очередь, например:

def code_metric(filename): 
    line_count = char_count = 0 
    with open(filename) as fin: 
     stripped = (line.rstrip() for line in fin) 
     for line_count, line in enumerate(filter(None, stripped), 1): 
      char_count += len(line) 
    return line_count, char_count 

print(code_metric('cmtest.py')) 
# (3, 85) 
+0

Я понимаю, но он должен быть реализован с использованием стиля функционального программирования, используя карту функциональных функций, фильтр и уменьшить. Это для учебных целей. – BoJaNgLeS

+0

@BoJaNgLeS do-able - хотя и не очень удобочитаемый/рекомендованный ... gimme a mo ': p –

+0

@ JonClements- любая удача в определении этого? – BoJaNgLeS

1

Для подсчета строк, может быть, этот код чист:

with open(file) as f: 
    lines = len(file.readlines()) 

Во второй части программы, если вы собираетесь рассчитывать только непустые символы, то вы забыли удалить «\ т ' и н'. Если это так, то

with open(file) as f: 
    num_chars = len(re.sub('\s', '', f.read())) 

Некоторые люди посоветовали вам делать обе вещи в одном цикле. Это нормально, но если вы их разделяете, вы можете сделать их разными функциями и иметь больше возможностей повторного использования. Если вы не обрабатываете огромные файлы (или выполняете эти кодированные миллионы раз), это не должно иметь значения с точки зрения производительности.

+0

Если я использую 'с открытым (файлом) как f: num_chars = sum (map (лямбда l: len (re.sub ('\ s', '' , l)), f)) 'I get' (3,0) 'вместо' (3,85) ' – BoJaNgLeS

+0

Как выглядят ваши строки? У меня есть файл с строками '' 'abc d a e''' и' '' f oo o '' '. После запуска я получаю '' 'num_chars''' равно 10. –

+0

Almeda- В этом вопросе есть тестовый файл. Это проверка файла, и строки выглядят точно так, как показано в примере. – BoJaNgLeS

Смежные вопросы