2011-10-10 52 views
5

Tôi muốn xóa danh sách phụ khỏi danh sách trong Tcl. Tôi biết làm thế nào để làm điều đó cho danh sách chính bằng cách sử dụng lreplace nhưng tôi không biết làm thế nào để làm điều đó cho một danh sách phụ. Ví dụ:xóa danh sách phụ khỏi danh sách trong tcl

set a { 1 2 { {3 4} { 4 } } } 

Bây giờ tôi muốn loại bỏ {4} từ danh sách nội { {3 4} {4} }. Danh sách cuối cùng phải là:

a { 1 2 { {3 4} } }

Vui lòng đề xuất cách chấm điểm.

+1

những gì chúng tôi đang thiếu là tiêu chí bạn cần để chọn yếu tố cần xóa tức là nó luôn là danh sách phụ phụ thứ 2 trong danh sách phụ thứ 3 hoặc thứ gì đó khác? –

+0

cũng không phải lreplace thực sự tạo ra một danh sách mới, nó không làm thay thế cho tiêu chuẩn –

+0

nếu có ít hơn hai phần tử trong danh sách con nội bộ của danh sách {{3 4} {4}}, loại bỏ nó. như trong {3 4}, chúng ta có các phần tử nhưng trong {4} chỉ có một phần tử vì vậy tôi cần xóa {4}. – Ruchi

Trả lời

2

Kết hợp lindex để tải danh sách phụ nội bộ, lreplace để xóa phần tử của danh sách phụ nội bộ được trích xuất và lset để đặt lại danh sách phụ đã sửa đổi.

Nhưng thành thật mà nói, tôi có cảm giác có điều gì đó sai về mô hình dữ liệu của bạn.

1
proc retlist {a} { 
    set nl "" 
    foreach i $a { 
     if {[llength $i] > 1} { 
      set nl2 "" 
      foreach i2 $i { 
       if {[llength $i2] > 1} { lappend nl2 $i2 } 
      } 
      lappend nl $nl2 
     } else { 
      lappend nl $i 
     } 
    } 
    return $nl 
} 

Nếu bạn cần độ sâu thay đổi, bạn sẽ bị mất với mã này. Bạn cần đệ quy cho điều đó.

% set a {1 2 {{3 4} {5}}} 
1 2 {{3 4} {5}} 
% retlist $a 
1 2 {{3 4}} 

Vì danh sách ngoài không bao giờ được hiển thị trong tclsh.

1

Nó đòi hỏi một vài thủ thuật để làm độc đáo:

proc lremove {theList args} { 
    # Special case for no arguments 
    if {[llength $args] == 0} { 
     return {} 
    } 
    # General case 
    set path [lrange $args 0 end-1] 
    set idx [lindex $args end] 
    lset theList $path [lreplace [lindex $theList $path] $idx $idx] 
} 

set a [lremove $a 2 1] 

này hoạt động vì cả hai lsetlindex có thể mất con đường, và họ làm những điều hợp lý với một con đường trống rỗng quá.

+0

Tôi đoán vấn đề của anh ta là biết đường dẫn ... và do đó anh ta cần lặp lại danh sách của mình để xem phần tử nào trong danh sách/danh sách con của anh ta là một giá trị duy nhất (tiêu chí của anh ta). – unNamed

Các vấn đề liên quan