2015-05-27 2 views

ответ

0

Одним из решений является призывать в 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

+0

Красивое решение! –

+1

Осторожно: если одна из пар имеет тот же 0-й элемент, вы потеряете одно из значений: 'dict values ​​[concat {*} {{a 1} {b 2} {c 3} { a 4}}] 'возвращает' 4 2 3' –

+0

@glennjackman: да, поэтому моя сноска. Но, возможно, я должен сделать это более ясным. –

3

Вы можете использовать это:

$ 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

+0

Это, как я это сделать, но я искал более элегантное решение ... –

+0

@HardwareEng. Я добавил однострочное решение, используя 'lmap' –

+0

Хороший. Но, к сожалению, я использую Tcl8.5 –

1

Я использовал следующие функции:

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} 
Смежные вопросы