Как объединить две петли в понимание списка - PullRequest
0 голосов
/ 01 мая 2018

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

def get_capital_prop(data):
    total_capitals = []
    temp = 0

    for i in range(len(data)):
        count = 0
        for word in data[i]:
            count += sum(1 for c in word if c.isupper())
        total_capitals.append(count / len(data[i]))
    return total_capitals

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Исходя из вашей текущей реализации, я предполагаю, что вы набираете общее количество слов, которые содержат только заглавных букв.

def is_caps(word):
    return word.isupper() and word.isalpha()

def get_capital_prop(data):
    return len([word for words in data for word in words if is_caps(word)])

isupper() вернет True, если строка содержит хотя бы одну букву, а каждая буква в верхнем регистре. При этом игнорируются любые цифры, символы или специальные символы, которые не имеют верхнего или нижнего регистра. Вспомогательная функция is_caps проверяет, является ли слово полностью заглавными и содержит только буквы алфавита, возвращая True, если это так, или False в противном случае.

Вот краткий пример, который я включил:

В:

some_text = '''
This is just some EXAMPLE TEXT that
I have put together.  Hopefully this ANSWER
is helpfuL!! 123AA'''

rem = ',!?.\'"()'  # Symbol characters removed from the start and end of words
data = [[word.strip(rem) for word in words.split(' ')] for words in some_text.split('\n')]

Из:

>>>print(data)  # Only 4 fully capitalized words: EXAMPLE, TEXT, I and ANSWER
[[''], ['This', 'is', 'just', 'some', 'EXAMPLE', 'TEXT', 'that'], ['I', 'have', 'put', 'together', '', 'Hopefully', 'this', 'ANSWER'], ['is', 'helpfuL', '123AA']]

>>>print(get_capital_prop(data))
4

Если вы хотите включить в свой ответ заглавные слова с апострофами, такими как «НЕ» или «НЕ ДОЛЖНО» , вы можете легко изменить логику внутри is_caps() вспомогательная функция в зависимости от того, что вы хотите.

0 голосов
/ 01 мая 2018

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

def get_capital_prop(data):
    return len([word for words in data for word in words if word[0].isupper()])

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

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

def get_capital_prop(data):
    return [len([c for c in email if c.isupper()]) for email in data]

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

def get_capital_prop(data):
    return [sum(1 for c in email if c.isupper()) for email in data]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...