【问题标题】:Extract matching fileds from dictonary从字典中提取匹配字段
【发布时间】:2017-03-06 15:50:40
【问题描述】:

有没有更聪明的方法可以将 OrderedDict 中的所有键提取到新字典中?

例如:我会将所有与'pre'匹配的键收集到字典'cfg_pre'中。我试过这个(它有效):

#!/usr/bin/env python
import collections

dl=collections.OrderedDict()

dl ={ 
        'pre_enable': True, 
        'pre_path': '/usr/bin/pre_script.sh', 
        'pre_args': '-la -w --dir', 
        'post_enable': True, 
        'post_path': '/usr/bin/post_script.sh', 
        'fail_enable': True, 
        'fail_path': '/usr/bin/failure_script.sh', 
        'fail_args': '--debug 4'
        }

cfg_pre = dict((k,v) for k, v in dl.items() if 'pre' in k)
cfg_post= dict((k,v) for k, v in dl.items() if 'post' in k)
cfg_fail=dict((k,v) for k, v in dl.items() if 'fail' in k)


print (cfg_pre)
print ("---")
print(cfg_post)
print ("---")
print(cfg_fail)
print ("---")

dl-dict 中的键总是以 pre、post 或 fail 开头。 谢谢;)

【问题讨论】:

  • 请注意,重新分配给dl后,它不再是OrderedDict。
  • 你希望你的输出是什么? 3 个字典,3 个OrderedDicts?还有什么?
  • 我认为你的解决方案已经很好了。看不到明显更好的替代方案。 ----这对print {x.split('_')[0] for x in dl.keys()}有帮助吗?会给set(['pre', 'fail', 'post'])
  • 哦,好的。耶,这只是一个精简的最小示例。谢谢! - 为了进一步使用,我想要 3 个字典。一个包含所有前置内容,一个包含所有错误内容等等。
  • 你可以使用字典理解,{k:v for k, v in dl.items() if 'pre' in k} 注意,写一个循环可能会更快,因为你只需要遍历字典一次而不是 3 次

标签: python dictionary ordereddictionary


【解决方案1】:

编辑 -> 更新以满足您的需要

如果你想概括,我建议按方法分组。类似的东西:

import itertools as it

#define a function to split your universe (here the beginning of your keys)
def keyfunc(key):
    return key.split('_')[0]

#group by prefixes
groups = {k:list(g) for k,g in it.groupby(dl, keyfunc)}

#build your output
output = {g:[(key,dl[key]) for key in v] for g,v in groups.items()}

你会得到以下输出:

{'fail': [('fail_enable', True),
  ('fail_path', '/usr/bin/failure_script.sh'),
  ('fail_args', '--debug 4')],
 'post': [('post_enable', True), ('post_path', '/usr/bin/post_script.sh')],
 'pre': [('pre_enable', True),
  ('pre_path', '/usr/bin/pre_script.sh'),
  ('pre_args', '-la -w --dir')]}

【讨论】:

    【解决方案2】:

    我会说三行对于这样的问题已经足够短了。

    使用 dict 理解会更简洁:

    cfg_pre = {k: v for k, v in dl.items() if 'pre' in k}
    cfg_post = {k: v for k, v in dl.items() if 'post' in k}
    cfg_fail = {k: v for k, v in dl.items() if 'fail' in k}
    

    您也可以像这样删除冗余数据:

    cfg_pre = {k.replace('pre_', ''): v for k, v in dl.items() if 'pre' in k}
    cfg_post = {k.replace('post_', ''): v for k, v in dl.items() if 'post' in k}
    cfg_fail = {k.replace('fail_', ''): v for k, v in dl.items() if 'fail' in k}
    

    字典会更加一致,prepostfail的信息只会存储在变量名中:

    cfg_pre = {'args': '-la -w --dir', 'enable': True, 'path': '/usr/bin/pre_script.sh'}
    cfg_post = {'enable': True, 'path': '/usr/bin/post_script.sh'}
    cfg_fail = {'args': '--debug 4', 'enable': True, 'path': '/usr/bin/failure_script.sh'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-26
      • 2017-02-28
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 2020-12-30
      相关资源
      最近更新 更多