Отсортировать элементы массива (буквы) в алфавитном порядке, независимо от их регистра

from itertools import product

gams_1=['AbCd', 'AbCD', 'Abcd', 'AbcD']
gams_2=['AbCD', 'AbCd']

f_0=list(product(gams_1,gams_2))
f_1=[]
for i in range(len(f_0)):
    f_1.append(''.join(f_0[i]))
for i in range(len(f_1)):
    f_1[i]=sorted(f_1[i].casefold())

print(f_1)

Этот код полностью рабочий, но при выводе результата буквы должны сохранить свой регистр, чего я реализовать не смог. При удалении метода .casefold() элементы выводятся в виде [['A', 'A', 'C', 'C', 'D', 'b', 'b', 'd'], ... ], то есть сортируются как в алфавитном порядке, так и по регистру. Сортировки по регистру нужно избежать, то есть должно выводиться [['A','A','b','b','C','C','d','D']] ... ].


Ответы (1 шт):

Автор решения: gil9red

В sorted можно передавать функцию key по которой будет выполняться сортировка.

Попробуйте:

f_2 = []
for sub_lst in f_0:
    f_2.append(sorted(''.join(sub_lst), key=str.lower))
print(f_2)
# [['A', 'A', 'b', 'b', 'C', 'C', 'd', 'D'], ['A', 'A', 'b', 'b', 'C', 'C', 'd', 'd'], ...

В вашем случае, возможно, лучше указывать str.casefold вместо str.lower (это зависит от обрабатываемых строк)


PS.

В одну строку:

f_2 = [sorted(''.join(sub_lst), key=str.lower) for sub_lst in f_0]
→ Ссылка