转换成字典/类型列表,包含字符串列表的字符串列表?

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然后才发现用adict或other替换每个层次结构级别的所有非列表元素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
]
Altendky

下面有一堆乱七八糟的东西,但是其中的核心算法solution()似乎还不错。我不能说我喜欢sentinel那里,但是...这使其他一切都整齐了。

https://repl.it/@altendky/ChartreuseWeightyRoot-10

import functools
import itertools
import random
import string

import attr
import toolz


@attr.s(frozen=True)
class Example:
    source = attr.ib()
    target = attr.ib()
    group_handler = attr.ib()


def random_example():
    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.random()) ** 10, 4)
        if random.randint(0, 1) % 2 == 0
        else random.randint(20, 50)
        if random.randint(0, 1) % 2 == 0
        else ('foo', 'bar', 'can', 'haz', 'bzr')[random.randint(0, 4)])
            for c in string.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]

    auauughhghhhh = [
        {f'{a}_key': a, f'{a}_val': b,
        f'{c}_key': c, f'{c}_val': d,
        f'{e}_key': e, f'{e}_val': f},
        g,
        [
            {f'{h}_key': h, f'{h}_val': i,
            f'{j}_key': j, f'{j}_val': k}
        ],
        {f'{l}_key': l, f'{l}_val': m},
        n,
        [
            {f'{o}_key': o, f'{o}_val': p,
            f'{q}_key': q, f'{q}_val': r},
            [
                {f'{s}_key': s, f'{s}_val': t,
                f'{u}_key': u, f'{u}_val': v,
                f'{w}_key': w, f'{w}_val': x,
                f'{y}_key': y, f'{y}_val': z}
            ],
            {f'{a}_key': a, f'{a}_val': b}
        ],
        {f'{c}_key': c, f'{c}_val': d},
        e
    ]

    g = lambda k,v: {'{}_key'.format(k): k, '{}_val'.format(k): v}

    return Example(
        source=l1,
        target=auauughhghhhh,
        group_handler=functools.partial(process_group, paired_sequence_handler=lambda s: build_dict_by_update(s, g)),
    )


def process_group(group, paired_sequence_handler):
    processed_group = []

    if len(group) == 0:
        return processed_group

    odd = (len(group) % 2) != 0
    raw_pairs = group[:-1] if odd else group
    pairs = toolz.partition_all(2, raw_pairs)
    result = paired_sequence_handler(pairs)

    processed_group.append(result)

    if odd:
        processed_group.append(group[-1])

    return processed_group


def build_dict_by_update(sequence, pair_handler):
    result = {}
    for pair in sequence:
        result.update(pair_handler(*pair))

    return result


examples = [
    Example(
        source=['foo', 'bar', ['can', 'haz']],
        target=[{'key': 'foo', 'val': 'bar'}, [{'key': 'can', 'val': 'haz'}]],
        group_handler=functools.partial(process_group, paired_sequence_handler=lambda s: build_dict_by_update(s, lambda k,v: {'key': k, 'val': v})),
    ),
    random_example(),
]


def solution(source, group_handler):
    built = []
    group = []

    sentinel = object()

    for value in itertools.chain(source, [sentinel]):
        if not isinstance(value, list) and value is not sentinel:
            group.append(value)
            continue

        built.extend(group_handler(group))
        group = []

        if value is sentinel:
            break

        result = solution(
            source=value,
            group_handler=group_handler,
        )
        built.append(result)

    return built



for example in examples:
    result = solution(
        source=example.source,
        group_handler=example.group_handler,
    )

    succeeded = result == example.target

    print('?', succeeded)

    if not succeeded:
        print('?  ', example.target)
        print('?  ', result)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

字符串列表

来自分类Dev

将字符串列表转换为字典

来自分类Dev

Python 2.7将字符串列表转换为字典

来自分类Dev

包含字符串列表的对象

来自分类Dev

字符串列表到字典列表的列表

来自分类Dev

如何转换字符串列表?

来自分类Dev

转换时间戳字符串列表

来自分类Dev

将字符串列表转换为正确的类型

来自分类Dev

将列表(对象)列表转换为字符串列表

来自分类Dev

遍历字符串列表

来自分类Dev

字符串列表的EditFor

来自分类Dev

printf字符串列表

来自分类Dev

字符串列表的组合

来自分类Dev

GROUPBY字符串列表

来自分类Dev

创建字符串列表

来自分类Dev

比较字符串列表

来自分类Dev

字符串列表的EditFor

来自分类Dev

返回字符串列表

来自分类Dev

从字符串列表制作字典(从列表的元素创建键)

来自分类Dev

将字符串列表更改为字典列表

来自分类Dev

通过子字符串列表过滤字典列表

来自分类Dev

Python“字符串或字符串列表”类型约定?

来自分类Dev

展平包含子列表的字符串列表

来自分类Dev

将字符串列表转换为模板字符串列表

来自分类Dev

将字符串列表转换为非字符串列表

来自分类Dev

使用字典替换字符串列表中的字符

来自分类Dev

将字符串列表转换为int列表

来自分类Dev

Prolog将字符串列表转换为数字列表

来自分类Dev

将字符串列表转换为数字列表Python