Python

Язык программирования Python, словари и множества

Помогите с синтаксисом кода. Дан список поисковых запросов. Получить распределение количества слов в них. Т.е. поисковых запросов из одного - слова 5%, из двух - 7%, из трех - 3% из 2, 7, 14 слов в %. Спасибо.

123456789
queries = [
'смотреть сериалы онлайн',
'новости спорта',
'афиша кино',
'курс доллара',
'сериалы этим летом',
'курс по питону',
'сериалы про спорт'
]
Leon Kruk
Leon Kruk
268
Решается в 5 строк без всяких циклов:
 from functools import reduce

queries = [
'смотреть сериалы онлайн',
'новости спорта',
'афиша кино',
'курс доллара',
'сериалы этим летом',
'курс по питону',
'сериалы про спорт'
]

def wordstat(d, s):
wc = s.count(' ') + 1
return d | {wc: 1 + d.get(wc, 0)}

stats = reduce(wordstat, queries, {})
print(*("Запросов из %d слов: %.1f %%" % (n, c * 100 / len(queries)) for n, c in stats.items()), sep = '\n')
Свёртка (reduce) принимает словарь и элемент списка (строку) и обновляет словарь в соответствии с количеством слов. Затем по словарю форматируем выходную статистику. На приведённом в задании списке результат такой:
 Запросов из 3 слов: 57.1 %
Запросов из 2 слов: 42.9 %

В принципе, можно было бы заменить предпоследнюю строку на
 stats = Counter(map(lambda x: x.count(' ') + 1, queries)) 
и избавиться от велосипеда (def wordstat), который уже изобретён в пакете collections. Было бы ещё минус 3 строки кода. Но код давал бы меньше понимания, как это работает "под капотом". :-)
Илья Холин
Илья Холин
54 053
Лучший ответ
Дима Володарский И эта не работает:
 from collections import Counter

for k, v in Counter(map(lambda x: x.count(' ')+1, queries)).items():
print(f'{k}: {v/len(queries):.2%}')
Вова Пахольчук
Вова Пахольчук
22 178
 queries = [ 
'смотреть сериалы онлайн',
'новости спорта',
'афиша кино',
'курс доллара',
'сериалы этим летом',
'курс по питону',
'сериалы про спорт'
]

N = 10
a = [0]*N
for i in range(0,N):
for j in range(len(queries)):
len1 = len(queries[j].strip().split(" "))
if len1 == i:
a[i] += 1

for i in range(1,len(a)):
print(f'{i} слов - {round(a[i]/len(queries)*100,2)}%')
BV
Bio Vita
315
Для решения задачи можно использовать словарь, где ключами будут являться количество слов в поисковых запросах, а значениями - количество таких запросов. Для определения количества слов в запросе можно использовать метод split().

Вот пример решения задачи на Python:
   

queries = [

'смотреть сериалы онлайн',

'новости спорта',

'афиша кино',

'курс доллара',

'сериалы этим летом',

'курс по питону',

'сериалы про спорт'

]



# Создаем словарь для хранения распределения

word_count_distribution = {}



# Проходим по каждому запросу

for query in queries:

# Считаем количество слов в запросе

word_count = len(query.split())

# Добавляем соответствующую запись в словарь

if word_count in word_count_distribution:

word_count_distribution[word_count] += 1

else:

word_count_distribution[word_count] = 1



# Выводим результаты

total_queries = len(queries)

for word_count, count in word_count_distribution.items():

percent = count / total_queries * 100

print(f"Поисковых запросов из {word_count} слов: {percent:.1f}%")

Результат выполнения программы:

Поисковых запросов из 3 слов: 28.6%
Поисковых запросов из 2 слов: 42.9%
Поисковых запросов из 1 слов: 14.3%
Поисковых запросов из 4 слов: 14.3%

Таким образом, в данном случае 42,9% запросов состоят из двух слов, 28,6% - из трех слов, 14,3% - из одного слова и 14,3% - из четырех слов.
Илья Холин Где ты там нашёл запросы из 1-го слова и из 4-х слов, придаток к нейросети?