a = ['foo', 'bar', ['can', 'haz']]
Нужно применить функцию к каждой паре строк, заменив их, в том числе внутри списков. Например,
f = lambda k,v: {'key': k, 'val': v}
Так что f(a)
станет:
[{'key': 'foo', 'val': 'bar'}, [{'key': 'can', 'val': 'haz'}]]
Выше a
только 2 измерения, но мне будет интересно k Габаритные размеры. Начал взламывать что-то вместе с boltons.iterutils.remap
, прежде чем стало ясно, что замена всех элементов, не включенных в список на каждом уровне иерархии, на dict
или другой f
не подходит для этого ...
РЕДАКТИРОВАТЬ: Другой пример
# create some random variables, alternative: `locals().update({c: (round(…`
a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z = tuple(
(round(abs(random()) ** 10, 4)
if randint(0, 1) % 2 == 0
else randint(20, 50)
if randint(0, 1) % 2 == 0
else ('foo', 'bar', 'can', 'haz', 'bzr')[randint(0, 4)])
for c in ascii_lowercase)
l1 = [a, b, c, d, e, f, g, [h, i, j, k],
l, m, n, [o, p, q, r, [s, t, u, v, w, x, y, z], a, b], c, d, e]
g = lambda k,v: {'{}_key'.format(k): k, '{}_val'.format(k): v}
Когда есть пары смежных друг с другом, он должен применить к нему конструктор типа T и присоединиться (у меня есть функция add_to
поддержка диктов, списков и т. д.) любого предыдущего, непосредственно смежного, без списка inbetwixt, иначе необработанный скаляр должен быть объединен в список в той же иерархии, в которой он находился ранее. Вот ожидаемый результат g(l1)
, исключая оценку переменных:
[
{'a_key': a, 'a_val': b,
'c_key': c, 'c_val': d,
'e_key': e, 'e_val': f},
g,
[
{'h_key': h, 'h_val': i,
'j_key': j, 'j_val': k}
],
{'l_key': l, 'l_val': m},
n,
[
{'o_key': o, 'o_val': p,
'q_key': q, 'q_val': r},
[
{'s_key': s, 's_val': t,
'u_key': u, 'u_val': v,
'w_key': w, 'w_val': x,
'y_key': y, 'y_val': z}
],
{'a_key': a, 'a_val': b}
],
{'c_key': c, 'c_val': d},
e
]