将dict列表转换为更便于下拉的形式

2024-09-25 00:33:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个友好的格式为多个相关的HTML下拉列表。你知道吗

如何转换字典d使其看起来像字典output?你知道吗

d = [
    {"state": "California", "county": "Monterey", "city": "Salinas"},
    {"state": "California", "county": "Monterey", "city": "Gonzales"},
    {"state": "Oregon", "county": "Douglas", "city": "Roseburg"},
    {"state": "Oregon", "county": "Douglas", "city": "Winston"},
    {"state": "California", "county": "Alameda", "city": "Berkeley"},
]

output = {
    "California": {
        "Monterey": ["Salinas", "Gonzales"],
        "Alameda": ["Berkeley"],
    },
    "Oregon": {
        "Douglas": ["Roseburg", "Winston"],
    }
}

我不希望使用Pandas,只使用纯Python,因为我还需要将解决方案转换为JavaScript(尽管如此,我尝试过将d转换为数据帧,应用各种方向,但没有一个方向提供我想要的输出)。你知道吗


Tags: cityoutput字典stateoregondouglasberkeleycounty
3条回答

循环浏览列表并处理每个字典,将每个条目添加到输出中的适当位置,必要时创建新的字典和列表。你知道吗

d = [
    {"state": "California", "county": "Monterey", "city": "Salinas"},
    {"state": "California", "county": "Monterey", "city": "Gonzales"},
    {"state": "Oregon", "county": "Douglas", "city": "Roseburg"},
    {"state": "Oregon", "county": "Douglas", "city": "Winston"},
    {"state": "California", "county": "Alameda", "city": "Berkeley"},
]

output = {}

for place in d:
    if place['state'] not in output:
        output[place['state']] = {}
    if place['county'] not in output[place['state']]:
        output[place['state']][place['county']] = []
    output[place['state']][place['county']].append(place['city'])

结果:

>>> import pprint
>>> pprint.pprint(output, width=30)
{'California': {'Alameda': ['Berkeley'],
                'Monterey': ['Salinas',
                             'Gonzales']},
 'Oregon': {'Douglas': ['Roseburg',
                        'Winston']}}

或者,用collections.defaultdict

from collections import defaultdict as dd
output = dd(lambda: dd(list))
for place in d:
    output[place['state']][place['county']].append(place['city'])

结果是:

>>> pprint.pprint(output)
defaultdict(<function <lambda> at 0x000000E254B53E18>,
            {'California': defaultdict(<class 'list'>,
                                       {'Alameda': ['Berkeley'],
                                        'Monterey': ['Salinas', 'Gonzales']}),
             'Oregon': defaultdict(<class 'list'>,
                                   {'Douglas': ['Roseburg', 'Winston']})})

您只能使用basic dictionaries with setdefault来执行此操作:

d = [
    {"state": "California", "county": "Monterey", "city": "Salinas"},
    {"state": "California", "county": "Monterey", "city": "Gonzales"},
    {"state": "Oregon", "county": "Douglas", "city": "Roseburg"},
    {"state": "Oregon", "county": "Douglas", "city": "Winston"},
    {"state": "California", "county": "Alameda", "city": "Berkeley"},
]

states = {}
for inner_dict in d:
    state  = inner_dict["state"]      # not strictly needed
    county = inner_dict["county"]     # you could simply add them
    city   = inner_dict["city"]       # directly to the setdefaults

    states.setdefault(state, {}).setdefault(county, []).append(city)


print(states)

输出:

{'California': {'Monterey': ['Salinas', 'Gonzales'], 
                'Alameda': ['Berkeley']}, 
 'Oregon': {'Douglas': ['Roseburg', 'Winston']}}

如果您需要更快的速度,请查看for ^{}'s,它没有每次创建默认对象的开销:

以下是我一直喜欢使用的一些实用函数:

from collections import defaultdict

def group_by_key_func(iterable, key_func):
    result = defaultdict(list)
    for item in iterable:
        result[key_func(item)].append(item)
    return result

def group_by_key(iterable, key):
    return group_by_key_func(iterable, lambda x: x[key])

有了他们,答案就变成了:

output = {
    state: {
        county: [row['city'] for row in county_group]
        for county, county_group in group_by_key(state_group, 'county').items()
    }
    for state, state_group in group_by_key(d, 'state').items()
}

相关问题 更多 >