Сортировка вложенных подсписков

Главная Форумы Python Помогите с питон кодом Сортировка вложенных подсписков

В этой теме 4 ответа, 2 участника, последнее обновление  Константин 2 мес., 3 нед. назад.

Просмотр 5 сообщений - с 1 по 5 (из 5 всего)
  • Автор
    Сообщения
  • #9143 Score: 0

    Константин
    Участник

    Здравствуйте!
    Прошу подсказать новичку в python, как отсортировать вложенные списки. Код для сортировки простого одноуровневого списка я осилил. Завис на моменте формирования цикла for для вложенных подсписков. Как правильно задать условия, чтобы цикл прогонялся по каждому подсписку в списке по очереди, при этом сохраняя порядок основного списка? Понимаю, что это просто, но не могу сам разобраться.

    То есть нужно {{“3*”},{“2*”},{“16″,”16*”,”7″,”7*”},{” “}} превратить в {{“3*”},{“2*”},{“7″,”7*”,”16″,”16*”},{” “}}

    #9144 Score: 1

    Анатолий
    Участник
    37 pts

    Добрый день! Для вашего конкретного случая

    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

    #9145 Score: 0

    Константин
    Участник

    Спасибо за ответ, узнал много нового!
    Но хотелось бы понять, можно ли как то заставить мой кусок кода работать с каждым вложенным подсписком в общем списке?
    То есть код отлично справляется с конкретным подсписком – например A[2] отдельно выдергиваю (на скрине видно). Как заставить этот кусок кода пройти по всем вложенным подспискам в списке? Мне кажется, для этого либо нужно ввести дополнительный цикл, либо переделать цикл под несколько “переменных”. Что-то вроде for i,j in list1… Дополнить шапку цикла. Или не получится?

    #9146 Score: 0

    Анатолий
    Участник
    37 pts

    Ваш код тоже можно заставить работать немного изменив.

    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
    #9147 Score: 0

    Константин
    Участник

    Спасибо большое за помощь!
    По аналогии причесал свой код. Получилось вот так, вроде работает. Пользовался 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
Просмотр 5 сообщений - с 1 по 5 (из 5 всего)

Для ответа в этой теме необходимо авторизоваться.