假设我有以下字符串:
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']}
