将3个列表组合成一个问题的问题

时间:2016-11-11 16:41:19

标签: python python-2.7

问题是如何在迭代它们的同时将三个列表组合在一起。

解释一下:

list_a has a bunch of the same keys
list_b has values
list_c has values
*Do the list have to be in order and what if they aren't????

以下是我的清单:

#list_a would be the key  

list_a = ['MACHINE TOOLS', 'MACHINE TOOLS', 'FLUID', 'MACHINE TOOLS','MACHINE TOOLS', 'VALVES', 'FLUID', 'VALVES']

list_b = ['GROUP A MTOOLS', 'GROUP B MTOOLS', 'GROUP C MTOOLS', 'GROUP D MTOOLS', 'GROUP A FLUID', 'GROUP B FLUID', 'GROUP A VALVES', 'GROUP B VALVES'] 

list_c = ['1', '2', '3', '44', '46', '47', '52', '53']

这是我希望看到的

{
    'MACHINE TOOLS': { 'GROUP A MTOOLS': '1', 'GROUP B MTOOLS': '2', 'GROUP C MTOOLS': '3', 'GROUP D MTOOLS': '44'}, 

    'FLUID': {'GROUP A FLUID': '46', 'GROUP B FLUID': '47'},

    'VALVES': {'GROUP A VALVES': '52', 'GROUP B VALVES': '53'}

}

我尝试了什么:

dic={ list_as:{ list_bs:[list_c] for list_bs in list_bs} for list_as in list_a}

^这接近我想要的但是由于某种原因,list_c的值没有被迭代 - 我尝试了一个for循环,但仍然没有运气。

1 个答案:

答案 0 :(得分:3)

好的,由于第一个字典中的键不与第二个字典中的键对齐,看起来您首先必须在其中一些名称之间定义静态映射。这看起来像是:

name_mapping = {"MTOOLS": "MACHINE TOOLS",
                "FLUID": "FLUID",
                "VALVES": "VALVES"}

然后,创建输出字典的空白版本。

output = {key:{} for key in set(list_a)}

最后,使用其他两个列表中的值更新该dict:

for inner_key, val in zip(list_b, list_c):
    for name, real_name in name_mapping.items():
        if inner_key.endswith(name):
            output[real_name][inner_key] = val

这导致你出现的列表:

{'FLUID': {'GROUP A FLUID': '46', 'GROUP B FLUID': '47'},
 'MACHINE TOOLS': {'GROUP A MTOOLS': '1',
                   'GROUP B MTOOLS': '2',
                   'GROUP C MTOOLS': '3',
                   'GROUP D MTOOLS': '44'},
 'VALVES': {'GROUP A VALVES': '52', 'GROUP B VALVES': '53'}}

如果列表中的值排成一行(例如'MACHINE TOOLS'始终显示在list_a中与'MTOOLS'中以list_b结尾的内容中的相同索引处,则此解决方案可以简化。