Задать вопрос
@WebDeveloper2016

Как взять буквенный срез?

Есть список людей, представленных объектами класса объектов класса. Например такой:
class Human:
    def __init__(self, age, name):
        self.age = age
        self.name = name
	
def main():
	l = [ Human(20, 'aaa'), Human(25, 'fff'), Human(30, 'ggg'), Human(35, 'jjj'), Human(40, 'zzz') ]

Надо из него получить всех людей у которых имя (name) начинается с буквы в диапазоне от 'f' до 'l' например. Причем нечувствительно к регистру.

upd. Обновление вопроса. А что если мне надо выбрать из БД через апи django записи такие? Например Human.objects.filter(). Не знаете у filter нет перегрузки принимающей функцию-предикат? Можно конечно вернуть через all() все объекты и из них уже выбирать, просто вдруг можно проще...
  • Вопрос задан
  • 187 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
import string
start_char = string.ascii_lowercase.index('f')
end_char = string.ascii_lowercase.index('l') + 1
ascii_range = string.ascii_lowercase[start_char:end_char]
filtered = [i for i in l if i.name[0].lower() in ascii_range]
Ответ написан
qlkvg
@qlkvg
python backend developer
import re
...
res=[h for h in l if re.match("^[f-l].{0,}", h.name.lower())]
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@abcd0x00
>>> class Human:
...     
...     def __init__(self, age, name):
...         self.age = age
...         self.name = name
... 
>>> lst = [Human(20, 'aaa'),
...        Human(25, 'fff'),
...        Human(30, 'ggg'),
...        Human(35, 'jjj'),
...        Human(40, 'zzz')]
>>> 
>>> out = [i for i in lst if 'f' <= i.name[0] <= 'l']
>>> out
[<__main__.Human object at 0xb740d50c>, <__main__.Human object at 0xb740d58c>, <__main__.Human object at 0xb740d5ac>]
>>> 
>>> [i.name for i in out]
['fff', 'ggg', 'jjj']
>>> 
>>> out = filter(lambda i: 'f' <= i.name[0] <= 'l', lst)
>>> out
<filter object at 0xb740d68c>
>>> 
>>> [i.name for i in out]
['fff', 'ggg', 'jjj']
>>>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы