


Как в 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}
Вы можете использовать генераторы списков и методы `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)