Skip to main content
 首页 » 编程设计

python之如何将 itertools.groupby 与 true/false lambda 函数一起使用

2025年05月04日19zhujiabin

假设我有以下字符串:

data = """ 
Pakistan[country] 
Karachi 
lahore 
islamabad 
UAE[country] 
dubai 
sharjah 
India[country] 
goa 
chennai 
""" 

如何在这里使用itertools.groupby 来得到字典(以国家为键)及其对应的城市?我最接近的是

from itertools import groupby 
 
filtered = (line for line in data.split("\n") if line) 
for key, values in groupby(filtered, lambda line: line.endswith('[country]')): 
    print(key) 
    print(list(values)) 

但是,如何正确地对结果进行分组呢?我对其他可能的解决方案不感兴趣(我自己写了一个生成器函数)但想明确地使用/理解 itertools.groupby。


我的生成器函数看起来像

def grouper(string): 
    collect, country, cities = False, None, list() 
 
    filtered = (line for line in string.split("\n") if line) 
    for line in filtered: 
        if line.endswith('[country]') and not collect: 
            country = line.replace("[country]", "") 
            collect = True 
        elif line.endswith('[country]') and collect: 
            yield {country: cities} 
            country = line.replace("[country]", "") 
            cities = list() 
        else: 
            cities.append(line) 
 
    if cities: 
        yield {country: cities} 
 
for dct in grouper(data): 
    print(dct) 
 
 
for dct in grouper(data): 
    print(dct) 

哪个产量

{'Pakistan': ['Karachi', 'lahore', 'islamabad']} 
{'UAE': ['dubai', 'sharjah']} 
{'India': ['goa', 'chennai']} 

请您参考如下方法:

不确定 itertools 但为什么不呢:

from collections import defaultdict 
 
data = """ 
Pakistan[country] 
Karachi 
lahore 
islamabad 
UAE[country] 
dubai 
sharjah 
India[country] 
goa 
chennai 
""" 
 
dct = defaultdict(list) 
 
country = '' 
 
for x in data.split('\n')[1:-1]: 
    if '[country]' in x: 
        country = x.replace('[country]', '') 
    else: 
        dct[country].append(x) 
 
print(dct) 
 
# {'Pakistan': ['Karachi', 'lahore', 'islamabad'], 'UAE': ['dubai', 'sharjah'], 'India': ['goa', 'chennai']}