我有一个字典列表,需要过滤嵌套字典中的“名称”键(值必须是唯一的)才能返回单个字典。 我有一个可行的解决方案,但认为会有更高效/优雅/ pythonic的方法。
我尝试了字典理解,但无法理解如何遍历列表
适用于2.7+和3的解决方案。
companies=[
{
'c01': {
'name':'x',
'address': '1 st'
}
},
{
'c02': {
'name':'y',
'address': '2 st'
}
},
]
company = [ c for c in companies if c.values() == [ v for v in c.values() if v['name']=='x'] ][0]
print company
输出:
{'c01': {'name': 'x', 'address': '1 st'}}
答案 0 :(得分:1)
类似这样的事情。 For循环可以增强
company_dict = {}
for company in companies:
for c in company:
company_dict[c] = company.get(c)
print (company_dict)
答案 1 :(得分:1)
我一直喜欢使事物更具可读性,而不是尝试打高尔夫。 -虽然有时候也很有趣:)
话虽如此,我们可以简单地遍历贵公司中的每个元素并查找目标名称,然后返回该公司的信息:
def get_target_company_info(companies):
TARGET_NAME = 'loans'
for company in companies:
company_id = company.keys()[0]
name_val = company.get(company_id).get('name')
if name_val == TARGET_NAME:
return company
return None
company = get_target_company_info(companies)
print company
输出:
{'c01': {'name': 'loans', 'address': '1 st'}}
为了更接近您的期望,我们可以提供一个过滤util方法和过滤器,如下所示:
方法:
TARGET_NAME = 'loans'
def is_relevant_company(company):
company_id = company.keys()[0]
name_val = company.get(company_id).get('name')
return company if name_val == TARGET_NAME else None
过滤器:
relevant_companies = filter(None, [is_relevant_company(company) for company in companies])
输出:
[{'c01': {'name': 'loans', 'address': '1 st'}}]
答案 2 :(得分:1)
尝试一下:
[c for c in companies if any(['name' in c[x] and c[x]['name']=='x' for x in c])]
这会过滤掉所有带有name == "x"
的公司,您的示例的输出将是:
[
{'c01': {'name': 'x', 'address': '1 st'}}
]
答案 3 :(得分:1)
您只需要一本字典,因此不需要列表理解。只要找到匹配项,就使用循环遍历并中断公司(假设列表中的每个项目的数据结构都相同)。
target = 'loans'
result = {}
for company in companies:
data = company.values()[0] # There is only one name & address per company record.
if data['name'] == target: # Check if the company name matches the target.
result = data # If so, set the result to the data for the target company.
break # Then break from the loop, as you've found the only match.
对于python 3,您需要进行以下修改:
data = list(company.values())[0]
答案 4 :(得分:0)
def find_company_with_name(name):
return next(c for c in companies if c.values()[0]['name'] == name)
使用生成器表达式比使用列表表达式更有效,因为一旦找到匹配项,生成器表达式便可以停止搜索,而不会生成列表的其余部分。