#python #python_3x
Дан массив из строк, которые содержат смайлики, типа: [':D',':~)',';~D',':)'] Нужно определить, сколько смайликов "с улыбкой" Улыбкой считаются такие: :) :D ;-D :~) Алгоритм: def count_smileys(arr): num = 0 for i in range(len(arr)): if ")" or "D" in arr[i]: num =+ 1 return num Вот только, если подать аргументом функции строку с примером выше, мой num насчитает только 1, а не 4. Причем все итерации проходят. Как оказалось,надо учитывать, что у смайлика должны быть: одни из таких "глаз" ;: один из таких "носов"(или его отсутствие) -~ и одна из таких "улыбок" )D . Я пробовал через регулярные выражения: return int(len(re.findall('[:;][-~]?[)D]', arr))) но это так же не срабатывает, вываливаясь с ошибкой expected string or bytes-like object
Ответы
Ответ 1
Попробуйте: def count_smileys(arr): num = 0 for x in arr: if ")" in x or "D" in x: num += 1 return num smileys = [':D', ':~)', ';~D', ':)'] print(count_smileys(smileys)) # 4 Вариант через регулярное выражение: import re def count_smileys(arr): num = 0 for x in arr: if re.match('[;:][-~]?[)D]', x): num += 1 return num # Вариант в одну строку: def count_smileys(arr): return sum(bool(re.match('[;:][-~]?[)D]', x)) for x in arr) smileys = [':D', ':~)', ';~D', ':)', ':(', ':(D'] print(count_smileys(smileys)) # 4Ответ 2
Думаю проблема все-таки в "+=" def count_smileys(arr): num = 0 for i in arr: if ")" in i or "D" in i: num += 1 return num И, как уточнили, проблема также в строении логического выраженияОтвет 3
Чтобы понять что происходит можно воспользоваться модулем dis (disassembler): In [367]: dis.dis('")" or "D" in ":-D"') 1 0 LOAD_CONST 0 (')') 2 JUMP_IF_TRUE_OR_POP 10 # прыгаем на строку 10, т.к. первый аргумент в `OR` вернет истину 4 LOAD_CONST 1 ('D') 6 LOAD_CONST 2 (':-D') 8 COMPARE_OP 6 (in) >> 10 RETURN_VALU У вас в коде две ошибки - вторую хорошо описал @TenDaI, если ее исправить то ваш код будет всегда возвращать число строк в массиве, независимо от их содержимогоОтвет 4
Я бы сделал несколько по-другому: a = [':D',':~)',';~D',':)'] res = (''.join(a)).count(')')+ (''.join(a)).count('D') либо, ещё лучше: smileys = [')', 'D'] for _ in smileys: res += (''.join(a)).count(_) print(res) При таком подходе не нужно лезть внутрь цикла, если придется менять критерии поиска.Единственный минус - такой подход не сработает для поиска смайлов типа ':)))'
Комментариев нет:
Отправить комментарий