Python

Как в python получить элемент из списка по нескольким значениям

Суть такая, мне нужен список(возможно любая другая коллекция) чтобы я мог быстро извлечь элементы которые подходят под два значение:
К примеру был бы список слов подходящих к определенной букве, и таких списков несколько, как мне иметь возможность получать например слово которое подходит к букве ю и имеет длину 5 букв, если такое есть
Если извлечь нужно именно _быстро_, то нужен словарь или словарь списков или словарь словарей.

Можно организовать, например, индекс по буквам:
 from functools import reduce
main_list = ['яблоко', 'груша', 'апельсин', 'ананас']

letter_idx = reduce(lambda d, t: d | { t[1][0]: d.get(t[1][0], []) + [t[0]] }, enumerate(main_list), {})

print(letter_idx)
Результат:
 {'я': [0], 'г': [1], 'а': [2, 3]} 

По первой букве лезем в словарь, достаём список слов, а его уже можно перебрать линейным поиском. В списке лежат индексы слов в основном списке.

Также внутри индекса по буквам можно сделать индекс по длине:
 from functools import reduce
main_list = ['яблоко', 'груша', 'апельсин', 'ананас']

letter_idx = reduce(lambda d, t: d | { t[1][0]: d.get(t[1][0], {}) | {len(t[1]): t[0]} }, enumerate(main_list), {})

print(letter_idx)
Результат:
 {'я': {6: 0}, 'г': {5: 1}, 'а': {8: 2, 6: 3}} 
По первой букве лезем в словарь, достаём другой словарь, и в нём ищем по длине. Результатом поиска является индекс в основном списке.

Или можно сделать индекс сразу по паре: первая буква и длина:
 main_list = ['яблоко', 'груша', 'апельсин', 'ананас']

letter_idx = { (s[0], len(s)): i for i, s in enumerate(main_list) }
(здесь рассчитано под хранение только одного значения по каждому ключу, иначе нужно хранить список, как в первом примере)
 {('я', 6): 0, ('г', 5): 1, ('а', 8): 2, ('а', 6): 3} 
Илья Spinner
Илья Spinner
87 571
Лучший ответ
Вы можете использовать генераторы списков и методы `filter` и `lambda`, чтобы получить элементы списка, которые соответствуют двум условиям.

Например, если у вас есть список слов `words`, который вы хотите проверить по букве `c` и длине `7`, вы можете сделать это следующим образом:

```
words = ["cat", "dog", "crow", "crab", "coat"]
result = list(filter(lambda x: "c" in x and len(x) == 7, words))
print(result)
```

Вы получите список `["crimson"]`, поскольку только это слово подходит под оба условия.

Программа:
words = ["cat", "dog", "crow", "crab", "coat"]
result = list(filter(lambda x: "c" in x and len(x) == 7, words))
print(result)