2016-03-24 17 views
0

TCL remove an element from a list'a baktım ve bana göre çalışmıyor gibi görünüyor. Örneğin bazı kod:tcl listesinden bir öğeyi listeden çıkar

Output: 
{a b c} {d e f} {g h i} 

Ben $ idx koyar, onunla çıkıyor:

set idx [lsearch $mylist "a"];  # or if "d", it should take out {d e f} instead. Likewise, if "g" it should take out {g h i} 
set mylist [lreplace $mylist $idx $idx] 
puts "$mylist" 

Output: 
{d e f} {g h i} 

Bu aslında olur:

set mylist [list {a b c} {d e f} {g h i}] 

Bu benim olmasını istediğim şey "-1" ne ararsam ararsın. Öğeleri sağlam bir endeksle kaldırmak çok kolay, ancak listeyi kaldırmak için listenin öğelerini arayabilmek için programa ihtiyacım var. Temel olarak, kaldırmak istediğim öğenin dizinini yalnızca bir parçasını arayarak nasıl bulabilirim?

DÜZENLEME: Nevermind. Aramanızda * kullanmanız gerektiğini anladım. Ben başka bir yerde burada görmedim beri, benim orijinal soruyu bırakacağım ve çözüm buldum:

set label "a" 
set idx [lsearch $mylist $label*] 
set mylist [lreplace $mylist $idx $idx] 

Output: 
{d e f} {g h i} 
+0

Bu dünyanın bir çok resmi tatil günleri; işler normalden biraz daha yavaştır. –

+0

Arama kalıbı '$ label *', yalnızca * belirtilen etiketle başlayan öğeleri bulacağınız anlamına gelir. –

cevap

1

her zaman her alt liste ilk elemanda arama terimi arıyorsunuz? Eğer öyleyse, her bir elemanın bir parçası incelenecek olan belirtir lsearch 'ın -index seçeneğini kullanabilirsiniz:

set mylist [list {a b c} {d e f} {g h i}] 
set label "a" 
set idx [lsearch -index 0 -exact $mylist $label] 
set mylist [lreplace $mylist $idx $idx]