为了账号安全,请及时绑定邮箱和手机立即绑定

如何获取键之前和键之后的值

如何获取键之前和键之后的值

慕森卡 2023-06-27 18:13:54
我下面有字典{'1': {'Col1': 'Val1', 'Col2': 'Val2', 'output': 'Out1'}, '2': {'Col1': 'Val1', 'Col2': 'Val2', 'output': 'Out1'}, '3': {'Col1': 'Val1', 'Col2': 'Val2', 'output': 'Out1'}, '4': {'Col1': 'Val1', 'Col2': 'Val2', 'output': 'Out1'}}我需要获取键之前的值output由于字典是无序的,我已转换为以下内容              OrderedDict([('1',              OrderedDict([('Col1', 'Val1'),                           ('Col2', 'Val2'),                           ('output', 'Out1')])),             ('2',              OrderedDict([('Col1', 'Val1'),                           ('Col2', 'Val2'),                           ('output', 'Out1')])),             ('3',              OrderedDict([('Col1', 'Val1'),                           ('Col2', 'Val2'),                           ('output', 'Out1')])),             ('4',              OrderedDict([('Col1', 'Val1'),                           ('Col2', 'Val2'),                           ('output', 'Out1')]))])预期输出如下,需要先提取值output{'1': ['Val1', 'Val2'],'2': ['Val1', 'Val2'],'3': ['Val1', 'Val2'],'4': ['Val1', 'Val2']}预期输出如下,需要提取output键后的值{'1': [],'2': [],'3': [],'4': []}用于测试的示例字典{'1': {'Col1': 'Val1', 'output': 'Out1', 'test': 'Out1'}, '2': {'Col1': 'Val1', 'output': 'Out1', 'test': 'Out1'}, '3': {'Col1': 'Val1','output': 'Out1'}, '4': {'Col1': 'Val1', 'output': 'Out1'}}预期输出如下,需要先提取值output{'1': ['Val1'],'2': ['Val1'],'3': ['Val1'],'4': ['Val1']}预期输出如下,需要提取output键后的值{'1': ['Out1'],'2': ['Out1'],'3': [],'4': []}
查看完整描述

2 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

您可以使用迭代器迭代项目并附加到before列表。当找到您要查找的键时,break从该循环开始,然后使用同一迭代器再次迭代以读取列表的值after。


from collections import OrderedDict


d = OrderedDict([('1',

                  OrderedDict([('Col1', 'Val1'),

                               ('Col2', 'Val2'),

                               ('output', 'Out1')])),

                 ('2',

                  OrderedDict([('Col1', 'Val1'),

                               ('Col2', 'Val2'),

                               ('output', 'Out1')])),

                 ('3',

                  OrderedDict([('Col1', 'Val1'),

                               ('Col2', 'Val2'),

                               ('output', 'Out1')])),

                 ('4',

                  OrderedDict([('Col1', 'Val1'),

                               ('Col2', 'Val2'),

                               ('output', 'Out1')]))])


def vals_before_and_after(od, key):

    it = iter(od.items())

    before_vals = []

    for k, v in it:

        if k == key:

            break

        before_vals.append(v)

    after_vals = [v for k, v in it]

    return before_vals, after_vals


before = OrderedDict()

after = OrderedDict()

for k, v in d.items():

    before[k], after[k] = vals_before_and_after(v, 'output')


print(before)

print(after)

给出:


OrderedDict([('1', ['Val1', 'Val2']), ('2', ['Val1', 'Val2']), ('3', ['Val1', 'Val2']), ('4', ['Val1', 'Val2'])])

OrderedDict([('1', []), ('2', []), ('3', []), ('4', [])])

如果您正在查找的密钥从未找到(break从未执行过),您也可能会引发异常。例如:


    ...

    for k, v in it:

        if k == key:

            break

        before_vals.append(v)

    else:

        raise RuntimeError(f'The key {key} was not found')

    ...


查看完整回答
反对 回复 2023-06-27
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

您可以使用字典理解:


dx = {k: list({i:x for i, x in v.items() if x != 'Out1'}.values()) for k,v in d.items()}


print(dx)


{'1': ['Val1', 'Val2'],

 '2': ['Val1', 'Val2'],

 '3': ['Val1', 'Val2'],

 '4': ['Val1', 'Val2']}


查看完整回答
反对 回复 2023-06-27
  • 2 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信