вы можете использовать tuple(sorted(set(l)))
для создания ключа для словаря:
elif len(l) == 2 or len(l) == 3:
key = tuple(sorted(set(l)))
output.append(lookup_dict[key])
где lookup_dict
это что-то вроде:
lookup_dict = {('A', 'G') : 'R',
('C', 'T') : 'Y',
('A', 'C'): 'M',
('A', 'C', 'T') : 'H', # note that it's A,C,T, not A,T,C, sort order!
}
... и т. Д. (Объединение обоих случаев длины 2 и 3)
Примечания:
- кортежи отсортированы в алфавитном порядке или
tuple(sorted(set(l)))
не будет соответствовать. tuple
требуется преобразование, поэтому ключи можно хэшировать (list
не подходит)
- благодаря словарю сложность поиска уменьшена с
O(n)
с вашим методом (плюс бесполезное и многократное set
создание) до O(1)
.
- код не обрабатывает случай "ошибки". Если совпадения нет, вы получите
KeyError
, вероятно, лучше, чем print('Error!')
. Если вы хотите проверить сначала, используйте key in lookup_dict
условие.
Как предлагается в комментариях, frozenset
также может использоваться как ключ словаря. В этом случае код проще:
elif len(l) == 2 or len(l) == 3:
key = frozenset(l)
output.append(lookup_dict[key])
и lookup_dict
требуется дополнительная предварительная обработка для преобразования ключей в тип frozenset
(но не требуется сортировка ключевых элементов, что менее подвержено ошибкам):
lookup_dict = {frozenset(k):v for k,v in lookup_dict.items()}
Но после этого решение, вероятно, будет немного быстрее.