我在列表中有多个词典。这些词典每个都包含公司名称和它们创建的部分。我想创建一个函数,该函数返回组成特定部分(有的有,有的没有的公司)的新公司列表。
我设法创建了一个列表,该列表从包含字典的列表中提取所有名称(值)。我“认为”我已经设法创建了一个函数,给定零件参数,它可以遍历每个字典并在新列表中附加构成零件的所有公司名称。但是我需要此函数,以便根据我作为参数传递的那一部分,它每次都会创建一个不同的列表,而不会(如代码所示)只是覆盖列表。
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理解,但是我也被困在那里。
答案 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']