Как я могу упорядочить список по одному из его подэлементов в TCL

#list #sorting #tcl

#Список #сортировка #tcl

Вопрос:

Итак, у меня есть строка, которая обрабатывается как список, когда я разделяю их в n, и она выглядит так:
{aaaa2,bbbb2,cccccc,dddddn aaaa3,bbbb4,cccccc,dddddn aaaa4,bbbb1,cccccc,dddddn aaaa5,bbbb3,cccccc,ddddd}

Мне нужно изменить порядок этого списка на основе столбца B таким образом, чтобы меньшее значение было первым, а равные значения оставались вместе. Это означает, что это должно быть что-то вроде этого:
{aaaa4,bbbb1,cccccc,dddddn aaaa2,bbbb2,cccccc,dddddn aaaa5,bbbb3,cccccc,dddddn aaaa3,bbbb4,cccccc,ddddd}

Как я могу это сделать?

Ответ №1:

Если вы разделите каждый элемент своего списка на сам список, вы можете использовать lsort -index опцию ‘s:

 set lst {aaaa2,bbbb2,cccccc,ddddd
    aaaa3,bbbb4,cccccc,ddddd
    aaaa4,bbbb1,cccccc,ddddd
    aaaa5,bbbb3,cccccc,ddddd}
set lst [lmap item $lst { split $item , }]
set lst [lsort -index 1 $lst]
puts [join [lmap sublist $lst { join $sublist , }] n]
  

выведет

 aaaa4,bbbb1,cccccc,ddddd
aaaa2,bbbb2,cccccc,ddddd
aaaa5,bbbb3,cccccc,ddddd
aaaa3,bbbb4,cccccc,ddddd
  

Комментарии:

1. Отличное использование lmap . Хорошая симметрия в разделении и объединении.

2. Вот почему lmap был добавлен; это значительно упрощает подобные задачи.