I have dictionary below
{'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'}}
I need to get the values before the key output
since dictionary is unordered i have converted into below
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')]))])
Expected out is below, need to extract the values before output
{'1': ['Val1', 'Val2'],
'2': ['Val1', 'Val2'],
'3': ['Val1', 'Val2'],
'4': ['Val1', 'Val2']}
Expected out is below, need to extract the values after the output
key
{'1': [],
'2': [],
'3': [],
'4': []}
Sample dictionary for testing
{'1': {'Col1': 'Val1', 'output': 'Out1', 'test': 'Out1'},
'2': {'Col1': 'Val1', 'output': 'Out1', 'test': 'Out1'},
'3': {'Col1': 'Val1','output': 'Out1'},
'4': {'Col1': 'Val1', 'output': 'Out1'}}
Expected out is below, need to extract the values before output
{'1': ['Val1'],
'2': ['Val1'],
'3': ['Val1'],
'4': ['Val1']}
Expected out is below, need to extract the values after the output
key
{'1': ['Out1'],
'2': ['Out1'],
'3': [],
'4': []}
You can iterate over items using an iterator and appending to before
list. When the key you are looking for is found, break
from that loop and then iterate again using that same iterator to read the values for the after
list.
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)
Gives:
OrderedDict([('1', ['Val1', 'Val2']), ('2', ['Val1', 'Val2']), ('3', ['Val1', 'Val2']), ('4', ['Val1', 'Val2'])])
OrderedDict([('1', []), ('2', []), ('3', []), ('4', [])])
You might also raise an exception if the key you are looking for is never found ( break
never executed). For example:
...
for k, v in it:
if k == key:
break
before_vals.append(v)
else:
raise RuntimeError(f'The key {key} was not found')
...
You can use dict comprehension:
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']}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.