【问题标题】:pop a key, value from values of a key in defaultdict(list) in python从python中defaultdict(list)中的一个键的值中弹出一个键,值
【发布时间】:2018-01-18 17:45:45
【问题描述】:

我有一个defaultdict(lambda: defaultdict(list))

jenkins_job_dict = defaultdict(<function <lambda> at 0x10428b230> , {
    'newswires': defaultdict(<type 'list'> , {
        'commodities': ['blue_virginia', 'green_virginia'],
        'nss_autopub_launch': ['blue_virginia'],
        'sample': ['blue_oregon', 'blue_virginia'],
        'commodities_efs': ['blue_virginia'],
        'gnews': ['blue_virginia']
    }),
    'usr': defaultdict(<type 'list'> , {
        'gatekeeper': ['blue_virginia'],
        'membership_services': ['green_virginia'],
        'membership_micro_db': ['green_virginia'],
        'pam_ml': ['blue_virginia', 'green_virginia'],
        'pam_rds': ['blue_virginia'],
        'preferences_api_db': ['blue_virginia', 'green_virginia'],
        'cs_microservice': ['blue_virginia'],
        'sample': ['blue_oregon', 'blue_virginia'],
        'preferences_api': ['blue_virginia'],
        'pam_app': ['blue_virginia', 'green_virginia']
    })
})

我需要从值中弹出第一个键值。所以从两个键中一次弹出一个(在键中键不必排序):

'commodities': ['blue_virginia', 'green_virginia']
'gatekeeper': ['blue_virginia']
'nss_autopub_launch': ['blue_virginia'] 
'membership_services': ['green_virginia']
…

我有以下代码:

def create_jenkins_job_dict(all_jobs):
    jenkins_job_dict = defaultdict(lambda: defaultdict(list))
    for job in all_jobs:
        if job.startswith("djin_a"):
            stackname = job.split('_', 2).pop(2)
            lz = job.split('_', 2).pop(1)[1:]
            stack_info = parse_stack_info(stackname, lz)
            if stack_info is not None:
                for key, value in stack_info.items():
                    if (value == "up"):
                        jenkins_job_dict[lz][stackname].append(key)
    return jenkins_job_dict

all_jobs = ['cost_explorer', 'cucumber', 'cucumber_reporter', 'cucumber_stacks_cleanup', 'cucumber_stacks_single_account', 'cucumber_stacks_update', 'deptwo.0-workflow', 'dispatcher-policy-setup', 'djin_abuild_active_directory_iandp_domains', 'djin_abuild_artifactory', 'djin_abuild_barrage_slaves', 'djin_abuild_cf_test_1', 'djin_abuild_epam', 'djin_abuild_epportal', 'djin_abuild_gate', 'djin_abuild_groups', 'djin_abuild_hostname_dispatcher_2', 'djin_abuild_jenkins_slaves', 'djin_abuild_netapp_ontap', 'djin_abuild_papi', 'djin_abuild_pibsec_se', 'djin_abuild_sonar_slave', 'djin_abuild_sonarqube', 'djin_acntsvc_category_manager', 'djin_acntsvc_consumer_search_marklogic_db', 'djin_acntsvc_searchh'] # list of names of jobs in jenkins.
jenkins_job_dict = create_jenkins_job_dict(all_jobs) # basically produces the above dict.
while jenkins_job_dict:
    stack_list = jenkins_job_dict.pop(min(jenkins_job_dict,key=jenkins_job_dict.get))
    stack = stack_list.pop(min(stack_list, key=stack_list.get))
    print (stack)

这没有得到我需要的东西,最pythonic的方法是什么?

【问题讨论】:

  • “所以按这个顺序弹出”:字典(即哈希表)根据定义是无序的。如果您想以特定顺序访问键和值,您应该事先按照您想要的顺序(例如在列表中)对键进行排序
  • 为了让它可重现,你能提供创建这个jenkins_job_dictdictionary的代码吗?
  • @Niema Moshiri 这就是为什么他/她使用来自collectionsdefaultdict 而不是内置的dict type
  • @NiemaMoshiri - 不必订购,只需一次弹出一个即可。
  • @Tony 我以为defaultdict 也是无序的?我以为OrderedDict 是唯一的有序字典

标签: python python-3.x python-2.7 tuples defaultdict


【解决方案1】:

这是你要找的吗:

outer={'a':{'b':[1,2,3], 'c':[4,5,6]}, 'd':{'e':[7,8,9], 'f':[10,11,12]}}
while outer:
    outer_key, inner = outer.popitem()
    while inner:
        inner_key, inner_value = inner.popitem()

【讨论】:

  • 漂亮,谢谢!我知道我可以用更简单的方法重现我的问题^.
猜你喜欢
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
相关资源
最近更新 更多