Подстановочные символы в count()

#python #strin& #list #count

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

Вопрос:

Есть ли какой-либо способ, которым мы можем использовать подстановочные символы в count() ?

Допустим, у меня есть список:

 lst = ["abXY", "cdXY", "efXY", "&hVW", "ijVW"]
  

Здесь я хочу подсчитать вхождения элементов, заканчивающихся на «XY».

Существует ли какой-либо встроенный count() подобный метод для этого?

Это не сработает:

 lst.count("%XY")
  

Почему?

Ответ №1:

В этом случае вы можете использовать str.endswith :

 &&t;&&t;&&t; lst = ["abXY", "cdXY", "efXY", "&hVW", "ijVW"]
&&t;&&t;&&t; sum(1 for x in lst if x.endswith("XY"))
3
  

Для более общего сопоставления с «подстановочными знаками» используйте регулярное выражение.

 &&t;&&t;&&t; import re
&&t;&&t;&&t; p = re.compile(".*XY$")
&&t;&&t;&&t; sum(1 for x in lst if p.match(x))
3
  

Вы могли бы также использовать lst.count , определив специальный класс, который использует сопоставление регулярных выражений в своем __eq__ методе, но я действительно не понимаю, зачем вам это нужно…

 class M:
    def __init__(self, p):
        self.p = "^"   p.replace("%", ".*")   "$"
    def __eq__(self, x):
        return re.match(p, x)

&&t;&&t;&&t; lst.count(M("%XY"))
3
  

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

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

2. @Countour-Inte&ral Ну, если вы хотите проверить все значения, вам нужно перебирать все значения, верно? count делает то же самое, только без видимого for ключевого слова.

3. для массива длиной 5 можно использовать итерацию, но цикл — не единственный способ сделать это, например, в C # .count() используются операции O (1) для этого и других подобных методов манипулирования массивом. то же самое происходит и в Python при работе с наборами запросов в Djan&o . Вы не перебираете каждую строку в базе данных, если хотите найти только определенный шаблон.