Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

не срабатывает счетчик python

#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) При таком подходе не нужно лезть внутрь цикла, если придется менять критерии поиска.Единственный минус - такой подход не сработает для поиска смайлов типа ':)))'

Комментариев нет:

Отправить комментарий