python过滤字典列表以返回单个字典

时间:2018-10-31 05:33:03

标签: python dictionary list-comprehension

我有一个字典列表,需要过滤嵌套字典中的“名称”键(值必须是唯一的)才能返回单个字典。 我有一个可行的解决方案,但认为会有更高效/优雅/ 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'}}

5 个答案:

答案 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)

使用生成器表达式比使用列表表达式更有效,因为一旦找到匹配项,生成器表达式便可以停止搜索,而不会生成列表的其余部分。