Удалите повторяющиеся элементы строки1 из строки2 в Tcl - PullRequest
0 голосов
/ 07 апреля 2020

Я хочу удалить повторяющиеся элементы строки1 из строки 2, а затем вывести новую строку. Мой код работает, только если дубликаты элементов расположены в последовательном порядке. Я хочу работать в любом порядке элементов. Пожалуйста, сообщите.

Текущий код:

set str1  "a 1 b 2 c 3 X Y Z"
set str2  "a 1 b 2 c 3 P Q R"
set results {}


set results [lmap a_elem $str1 b_elem $str2 {
    if {$a_elem != $b_elem} {string cat $b_elem} else continue      
}]   

puts $results    

Вывод следующего кода: P Q R

Однако, если

set str1 "a 1 b 2 c 3 X Y Z"
set str2 "P a 2 1 R c Q 3 b"

, тогда вывод будет: P a 2 1 R c Q 3 b

В основном то же самое, что и str2 без дублирования.

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

Если вы хотите вывести те элементы из списка в str2, которых нет в str1, вы должны сначала создать словарь элементов str1, чтобы вы могли использовать эффективные поиск (внутри таблицы есть sh таблицы). Вам настоятельно рекомендуется использовать для этого процедуру, поскольку она делает реализацию более эффективной.

proc removeItems {str1 str2} {
    foreach item $str1 {
        dict set items $item ""; # Value unimportant
    }
    lmap item $str2 {
        if {[dict exists $items $item]} continue
        string cat $item
    }
}

puts [removeItems "a 1 b 2 c 3 X Y Z"  "P a 2 1 R c Q 3 b"]
# P R Q

Код, естественно, предполагает, что порядок str2 важен.

0 голосов
/ 07 апреля 2020

Если производительность не важна, вы можете использовать более прямой:

set results [lmap elem $str2 {
    if {$elem ni $str1} {string cat $elem} else continue
}]
...