У меня есть список ключ-значение, таких как:Получить элементы в определенном списке индекса списков
set x {{a 1} {b 2} {c 3}}
Мне нужно извлечь все элементы индекса = 1 во всех подсписков получить:
{1 2 3}
У меня есть список ключ-значение, таких как:Получить элементы в определенном списке индекса списков
set x {{a 1} {b 2} {c 3}}
Мне нужно извлечь все элементы индекса = 1 во всех подсписков получить:
{1 2 3}
Одним из решений является призывать в dict values
команду:
dict values [concat {*}{{a 1} {b 2} {c 3}}]
Как это работает: dict values
собирает список, состоящий из любого другого элемента (начиная со второго) в другом списке. Это предназначено для использования в словарях, но так как словари в основном представляют собой только упорядоченные по размеру списки, он работает с любым списком четного размера с одной оговоркой: если какой-либо ключ появляется более одного раза, результат dict values
будет содержать только последние значение, связанное с этим ключом.
Список, состоящий из подписок с двумя предметами, может быть легко преобразован в список четных размеров, передавая подрезы индивидуально в качестве аргументов concat
.
Другой способ просмотра списка с помощью одного из методов, указанных в других ответах, или, может быть, как это:
set res {}
for {set i 0} {$i < [llength $x]} {incr i} {
lappend res [lindex $x $i 1]
}
set res
Это похоже на
set res {}
foreach item $x {
lappend res [lindex $item 1]
}
set res
(или соответствующий lmap item $x {lindex $item 1}
)
, но предоставляет возможность: 1) начать с индекса 0, 2) до конца списка и 3) пересечь e на два (или более) элемента.
Документация: concat, dict, for, foreach, incr, lappend, lindex, llength, lmap, set
Вы можете использовать это:
$ set y {}
$ foreach sublist $x { lappend y [lindex $sublist 1]}
$ puts $y
1 2 3
приготовления раствора для TCL 8.6 или более поздней версии:
Используйте lmap
перебирать x
без сохранения значения в любом месте, в одной строке:
$ lmap sublist $x {lindex $sublist 1}
Ссылки: lmap,tcl.tk
Это, как я это сделать, но я искал более элегантное решение ... –
@HardwareEng. Я добавил однострочное решение, используя 'lmap' –
Хороший. Но, к сожалению, я использую Tcl8.5 –
Я использовал следующие функции:
proc MapList {Var List Script} {
if {![llength $List]} {return $List}
upvar 1 $Var Item
foreach Item $List {lappend Res [uplevel 1 $Script]}
return $Res
}
И использовали его так:
MapList Arg $x {lindex $Arg 1}
Красивое решение! –
Осторожно: если одна из пар имеет тот же 0-й элемент, вы потеряете одно из значений: 'dict values [concat {*} {{a 1} {b 2} {c 3} { a 4}}] 'возвращает' 4 2 3' –
@glennjackman: да, поэтому моя сноска. Но, возможно, я должен сделать это более ясным. –