【发布时间】:2020-03-04 10:30:27
【问题描述】:
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 个维度感兴趣。在很明显用dict 或其他f 替换每个层次结构级别的所有非列表元素不是正确的用例之前,就开始与boltons.iterutils.remap 一起破解某些东西……
编辑:另一个例子
# 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 函数)任何先前直接相邻的 - 没有list 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
]
【问题讨论】:
-
这些值是否总是成对出现并且总是按
['key1', 'val1']对排序? -
是的。当不均匀时,尽管希望将其推到层次结构的末尾而不是对其进行解析。这样可以从一个递归函数处理不同级别的数据结构。
-
每个级别列表中的第一个两个元素是否总是
key后跟val?可以是['foo',['can','haz'],'bar'] -
每个字典的顺序重要吗?
-
@Ch3steR 不,它们后面可以跟其他列表或成对的标量 (
str|int|float),或单个标量(最终应该只是单独的元素)。 @Marcos 这个想法是你可以传入任意函数/类型,例如,OrderedDict、你的自定义类,或者你有什么。
标签: python functional-programming apply mutation list-manipulation