Во вложенном списке, как переместить узел дерева (сопоставив его по имени) на один уровень вверх? - PullRequest
0 голосов
/ 19 февраля 2019

Введение

Допустим, у меня есть список списков списков .... Теперь я знаю, что в этом дереве есть элементы, которые оказались списками только одного элемента.Скажем также, что я знаю название этих элементов.

Задача

Вопрос: Как пройти по дереву и развернуть (снять один слой) эти элементы?

Я ищу функцию, которая принимает два аргумента: 1. список ввода 2. имя удаляемых элементов.

Пример

В приведенном ниже примере у меня есть этот список / дерево input_list.Теперь я хочу переместить содержимое всех элементов в элементе 'x' на один уровень вверх.

Поэтому я хочу, чтобы списки x = [9:0x560f96c34f38] и x = [14:0x560f96c34de8] отбрасывались, но их содержимое перемещалось на один уровень вверх, вв этом случае список y и t должен стать прямыми дочерними узлами g и h.

. desired_list иллюстрирует желаемый результат.

Примечание: я использовалпакет lobstr, чтобы показать древовидную структуру, но я думаю, что могут быть более привлекательные варианты ... Не стесняйтесь предлагать.

library(lobstr)

input_list <- list(a = list(b = 1:2, c = 'tricky', d = list(e = 'business', f = 'what?'), g = list(x = list(y = 'aassd')), w = list(z = 'foo')), h = list(x = list(t = 'asd'), s = list(a = 'bar')))

desired_list <- list(a = list(b = 1:2, c = 'tricky', d = list(e = 'business', f = 'what?'), g = list(y = 'aassd'), w = list(z = 'foo')), h = list(t = 'asd', s = list(a = 'bar')))

lobstr::ref(input_list)
#> █ [1:0x560f96c24af8] <list> 
#> ├─a = █ [2:0x560f96c0bb88] <list> 
#> │     ├─b = [3:0x560f960f4ea0] <int> 
#> │     ├─c = [4:0x560f95851ad0] <chr> 
#> │     ├─d = █ [5:0x560f96c24bf8] <list> 
#> │     │     ├─e = [6:0x560f95851a60] <chr> 
#> │     │     └─f = [7:0x560f95851a28] <chr> 
#> │     ├─g = █ [8:0x560f96c34ec8] <list> 
#> │     │     └─x = █ [9:0x560f96c34f38] <list> 
#> │     │           └─y = [10:0x560f95851980] <chr> 
#> │     └─w = █ [11:0x560f96c34e58] <list> 
#> │           └─z = [12:0x560f958518d8] <chr> 
#> └─h = █ [13:0x560f96c24b78] <list> 
#>       ├─x = █ [14:0x560f96c34de8] <list> 
#>       │     └─t = [15:0x560f95851830] <chr> 
#>       └─s = █ [16:0x560f96c34d78] <list> 
#>             └─a = [17:0x560f95878840] <chr>
lobstr::ref(desired_list)
#> █ [1:0x560f95079a28] <list> 
#> ├─a = █ [2:0x560f9465d288] <list> 
#> │     ├─b = [3:0x560f948ae058] <int> 
#> │     ├─c = [4:0x560f958798b8] <chr> 
#> │     ├─d = █ [5:0x560f95078928] <list> 
#> │     │     ├─e = [6:0x560f95879880] <chr> 
#> │     │     └─f = [7:0x560f95879848] <chr> 
#> │     ├─g = █ [8:0x560f94493d58] <list> 
#> │     │     └─y = [9:0x560f95879810] <chr> 
#> │     └─w = █ [10:0x560f94493dc8] <list> 
#> │           └─z = [11:0x560f958797d8] <chr> 
#> └─h = █ [12:0x560f95078de8] <list> 
#>       ├─t = [13:0x560f958797a0] <chr> 
#>       └─s = █ [14:0x560f94493ea8] <list> 
#>             └─a = [15:0x560f95879768] <chr>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...