Сортировка вложенных подсписков
Главная › Форумы › Python › Помогите с питон кодом › Сортировка вложенных подсписков
Помечено: сортировка; многоуровневые
- В этой теме 4 ответа, 2 участника, последнее обновление 5 лет, 3 месяца назад сделано
Константин.
-
АвторСообщения
-
Константин
УчастникЗдравствуйте!
Прошу подсказать новичку в python, как отсортировать вложенные списки. Код для сортировки простого одноуровневого списка я осилил. Завис на моменте формирования цикла for для вложенных подсписков. Как правильно задать условия, чтобы цикл прогонялся по каждому подсписку в списке по очереди, при этом сохраняя порядок основного списка? Понимаю, что это просто, но не могу сам разобраться.То есть нужно {{“3*”},{“2*”},{“16″,”16*”,”7″,”7*”},{” “}} превратить в {{“3*”},{“2*”},{“7″,”7*”,”16″,”16*”},{” “}}
Добрый день! Для вашего конкретного случая
import clr clr.AddReference("DSCoreNodes") import DSCore from operator import itemgetter a = [["3*"],["2*"],["16*","16","7","7*"],[" "]] d = [] for b in a: l = [] c = sorted(b) lk1 = [] lk2 = [] if len(b)>1: for bb in b: k = bb.split("*") k1 = int(k[0]) lk1.append(k1) if len(k)>1: k2 = "*" lk2.append(k2) else: k2 = "" lk2.append(k2) kkk = [b,lk1,lk2] tr1 = DSCore.List.Transpose(kkk) b1 = sorted(tr1,key = itemgetter(1,2)) tr2 = DSCore.List.Transpose(b1) d.append(tr2[0]) else: d.append(c) OUT = d
Константин
УчастникСпасибо за ответ, узнал много нового!
Но хотелось бы понять, можно ли как то заставить мой кусок кода работать с каждым вложенным подсписком в общем списке?
То есть код отлично справляется с конкретным подсписком – например A[2] отдельно выдергиваю (на скрине видно). Как заставить этот кусок кода пройти по всем вложенным подспискам в списке? Мне кажется, для этого либо нужно ввести дополнительный цикл, либо переделать цикл под несколько “переменных”. Что-то вроде for i,j in list1… Дополнить шапку цикла. Или не получится?
Ваш код тоже можно заставить работать немного изменив.
import clr clr.AddReference("DSCoreNodes") import DSCore from operator import itemgetter list1 = IN[0] z = [] for j in list1: list2,list3=[],[] if len(j)>1: for i in j: if i.endswith("*"): i2=i.replace("*","") list2.append(int(i2)) list3.append("*") else: list2.append(int(i)) list3.append("") x=[list2,list3,j] tr1 = DSCore.List.Transpose(x) y=sorted(tr1, key = itemgetter (0,1)) tr2 = DSCore.List.Transpose(y) z.append(tr2[2]) else: z.append(j) OUT = z
Константин
УчастникСпасибо большое за помощь!
По аналогии причесал свой код. Получилось вот так, вроде работает. Пользовался zip, применение transpose из DScore не понял пока.import clr clr.AddReference('ProtoGeometry') from Autodesk.DesignScript.Geometry import * from operator import itemgetter list1 = IN[0] z=[] for j in list1: list2,list3=[],[] if len(j)>1: for i in j: if i.endswith("*"): i2=i.replace("*","") list2.append(int(i2)) list3.append("*") else: list2.append(int(i)) list3.append("") x=zip(list2,list3,j) y=sorted(x, key = itemgetter (0,1)) z.append(zip(*y)[2]) else: z.append(j) OUT =z
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.