通过过滤几个词典的列表创建多个列表

时间:2019-09-12 23:25:49

标签: python python-3.x list dictionary

我在列表中有多个词典。这些词典每个都包含公司名称和它们创建的部分。我想创建一个函数,该函数返回组成特定部分(有的有,有的没有的公司)的新公司列表。

我设法创建了一个列表,该列表从包含字典的列表中提取所有名称(值)。我“认为”我已经设法创建了一个函数,给定零件参数,它可以遍历每个字典并在新列表中附加构成零件的所有公司名称。但是我需要此函数,以便根据我作为参数传递的那一部分,它每次都会创建一个不同的列表,而不会(如代码所示)只是覆盖列表。

maker1 = {'Name': 'A', 'Parts': ('Eggs', 'Bacon', 'Spam')}
maker2 = {'Name': 'B', 'Parts': ('Eggs', 'Spam')}
maker3 = {'Name': 'C', 'Parts': ('Bacon', 'Beans')}
maker4 = {'Name': 'D', 'Parts': ('Bacon', 'Spam', 'ExtraSpam')}
makerlist = [maker1, maker2, maker3, maker4]


def maker_names(list1):
    maker_names = []
    for maker in range(len(list1)):
        maker_names.append(list1[maker]['Name'])
    print(maker_names)

def part_makers(part_name):
    part_makers = []
    for key in range(len(makerlist)):
        if part_name in makerlist[key]['Parts']:
            part_makers.append(makerlist[key]['Name'])
    print(part_makers)

maker_names(makerlist)
part_makers('Eggs')
part_makers('Beans')

(我认为)这可以正常工作,但是我无法弄清楚下一步。我已经研究过可能需要dict理解,但是我也被困在那里。

3 个答案:

答案 0 :(得分:0)

IIUC,使用collectios.defaultdict

from collections import defaultdict

def part_makers(maker_list):
    d = defaultdict(list)
    for i in maker_list:
        for p in i['Parts']:
            d[p].append(i['Name'])
    return d
part_makers(makerlist)

输出:

defaultdict(list,
            {'Eggs': ['A', 'B'],
             'Bacon': ['A', 'C', 'D'],
             'Spam': ['A', 'B', 'D'],
             'Beans': ['C'],
             'ExtraSpam': ['D']})

可以使用的来源:

partmakers = part_makers(makerlist)
partmakers['Eggs']
# ['A', 'B']

答案 1 :(得分:0)

通过对所有词典创建的makerlist使用列表理解,您可以轻松实现所需的结果

makerlist = [maker1, maker2, maker3, maker4]
def part_makers(makerlist,part):
    return [m['Name'] for m in makerlist if part in m['Parts']]

示例:

part_makers(makerlist,'Spam')

输出:

['A', 'B', 'D']

答案 2 :(得分:0)

使用filter方法是最简单的方法:

makerlist = [maker1, maker2, maker3, maker4]


def part_makers(part):
    new_list = list(filter(lambda company: part in company.get('Parts'), makerlist))
    return [company.get('Name') for company in new_list]


print(part_makers("Eggs"))

输出:

['A', 'B']