Введение
Допустим, у меня есть список списков списков .... Теперь я знаю, что в этом дереве есть элементы, которые оказались списками только одного элемента.Скажем также, что я знаю название этих элементов.
Задача
Вопрос: Как пройти по дереву и развернуть (снять один слой) эти элементы?
Я ищу функцию, которая принимает два аргумента: 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>