从dictonary中提取匹配的文件

时间:2017-03-06 15:50:41

标签: python dictionary ordereddictionary

有没有更智能的方法将OrderedDict中的所有键提取到新词典中?

例如:我将把所有与'pre'匹配的键收集到dict'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开头。 谢谢;)

2 个答案:

答案 0 :(得分:0)

我会说三条线足够短,可以解决这个问题。

对于词典理解来说会更清晰一点:

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}

字典将更加一致,有关 pre post fail 的信息将仅存储在变量名称中:

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

答案 1 :(得分:0)

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

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

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