Одним из вариантов может быть проверка того, является ли элемент arrangement
итеративным , и использование соответствующего понимания списка в зависимости от результата. Итак, с помощью некоторого рефакторинга вы можете сделать это:
import enum
import collections
# ...
class Test():
def __init__(self, arrangement):
def replace(a):
if a == E.A:
return "a_component"
elif a == E.B:
return "b_component"
elif a == E.C:
return "c_component"
return a
real_arrangement = [tuple(replace(e) for e in a) if isinstance(a, collections.Iterable) else replace(a) for a in arrangement]
print(real_arrangement)
#...
Это заставит все работать для обоих типов arrangement
списков (или "смешанных" списков), которые вы разместили в своем вопросе.
Без повторяющихся элементов:
arrangement = (E.A, E.C, E.B)
Test(arrangement)
# ['a_component', 'c_component', 'b_component']
Со всеми повторяемыми элементами:
arrangement = ((10, E.A), (20, E.C), (5, E.B), (1, E.A))
Test(arrangement)
# [(10, 'a_component'), (20, 'c_component'), (5, 'b_component'), (1, 'a_component')]
С некоторыми повторяемыми элементами:
arrangement = (E.A, (20, E.C), (5, E.B), (1, E.A))
Test(arrangement)
# ['a_component', (20, 'c_component'), (5, 'b_component'), (1, 'a_component')]