簡體   English   中英

如何獲取鍵前和鍵后的值

[英]How to get the values before a key and after a key

我下面有字典

{'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': []}

您可以使用迭代器迭代項目並附加到列表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')
    ...

您可以使用字典理解:

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']}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM