Какой лучший способ подсчитать alphanumeri c слов? - PullRequest
1 голос
/ 25 апреля 2020

Я пытаюсь найти наилучший способ подсчета alphanumeri c слов без использования регулярных выражений, и вот что я сделал.

for line in csv:
        total_lines += 1
        total_words = len(line.split())
        line_char_count =  sum(map(str.isalnum, line.split()))
        line_details.append("Line %d has %d Alphanumeric word/s" % (total_lines, line_char_count))

for line in line_details:
print (line)

Вместо подсчета alphanumeri c слов, он исключает alphanumeri c слов и подсчитывает не-alphanumeri c слов. Поэтому я попробовал другой подход:

for line in csv:
        total_lines += 1
        total_words = len(line.split())
        line_char_count =  sum(map(str.isalnum, line.split()))
        count = total_words - line_char_count
        line_details.append("Line %d has %d Alphanumeric word/s" % (total_lines, count))

for line in line_details:
print (line)

Я вычел line_char_count из общего количества слов строки. Теперь он дает мне точный ответ, но пунктуация все еще считается. Я не знаю, как лучше избавиться от знаков препинания. Или, если у вас есть лучший способ подсчитать слова alphanumeri c, пожалуйста, помогите мне. Спасибо

Ответы [ 3 ]

0 голосов
/ 25 апреля 2020

Регулярное выражение, вероятно, будет лучшим подходом. Но в любом случае ...

Это не решение регулярных выражений

В этой реализации предполагается, что любой символ или последовательность символов в алфавитном порядке c set засчитываются как одно слово. Так, например, он будет считать такие вещи, как имена идентификаторов в блоках кода.

Слова учитываются отдельно и разделяются любым не-алфавитным символом c; пробелы, табуляции, точки с запятой и косые черты, например. Если вы хотите считать слова с апострофами или дефисами в одном - добавьте их к набору chars.

>>> chars = set('abcdefghijklmnopqrstuvwxyz'
...             'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
...             '0123456789'
...             '_')     # Underscores to match identifiers?
...             # "-'")    Are these separators or parts of a word?
...
>>> def count_alphanum_words(s):
...     w = False
...     count = 0
...     for ch in s:
...         if ch in chars:
...             w = True
...         else:
...             if w:
...                 count += 1
...                 w = False
...     if w:
...         count += 1
...     return count
...     
>>> count_alphanum_words("Th3 qu1ck 8r0wn f0x jump3d 0v3r th3 l4zy d0g.")
9
>>> line_details = []
>>> for n, line in enumerate(csv, 1):
...     count = count_alphanum_words(line)
...     line_details.append("Line %d has %d Alphanumeric words" % (n, count))
...
>>> for line in line_details:
...     print(line)

Алгоритм должен быть быстрым, так как он проходит только один проход через символы на строка, чтобы получить количество слов. Другие подходы, использующие split(), включают в себя один проход для выполнения разбиений, затем другой проход для обработки списка элементов, которые он производит, плюс итерацию по символам отдельных слов, чтобы определить, являются ли они alphanumeri c.

Однако решения с split() и isalnum() выполняют больше операций в собственном коде. Таким образом, разница во времени исполнения этого кода по сравнению с другими решениями незначительна. Однако другие решения могут неправильно подсчитывать слова.

0 голосов
/ 25 апреля 2020

Это было написано в предположении, что слово - это любая строка непробельных символов:

for i, line in enumerate(csv, 1):
    alnum_words = sum(1 for word in line.split() if word.isalnum())
    line_details.append("Line %d has %d Alphanumeric word/s" % (i, alnum_words))
0 голосов
/ 25 апреля 2020

это то, что вы хотите?

line = "Rolls-Royce Motor Cars Inc. said it expects its U.S. sales to remain steady at about 1,200 cars in 1990"   
line_char =  sum(i.isalnum() for i in line.split())

print(line_char)

Вывод: 15

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...