Python — itertools.groupby 2
Просто возникли проблемы с itertools.groupby. Учитывая список словарей,
my_list= [
"AD01", "AD01AA", "AD01AB", "AD01AC", "AD01AD","AD02", "AD02AA", "AD02AB", "AD02AC"]
из этого списка я рассчитывал создать словарь, где ключ — самое короткое имя, а значения — самые длинные имена
пример
[
{"Legacy" : "AD01", "rphy" : ["AD01AA", "AD01AB", "AD01AC", "AD01AD"]},
{"Legacy" : "AD02", "rphy" : ["AD02AA", "AD02AB", "AD02AC"]},
]
не могли бы вы мне помочь, пожалуйста
1 ответ
Вы можете использовать
itertools.groupby
, с некоторыми
next
с:
from itertools import groupby
my_list= ["AD01", "AD01AA", "AD01AB", "AD01AC", "AD01AD","AD02", "AD02AA", "AD02AB", "AD02AC"]
groups = groupby(my_list, len)
output = [{'Legacy': next(g), 'rphy': list(next(groups)[1])} for _, g in groups]
print(output)
# [{'Legacy': 'AD01', 'rphy': ['AD01AA', 'AD01AB', 'AD01AC', 'AD01AD']},
# {'Legacy': 'AD02', 'rphy': ['AD02AA', 'AD02AB', 'AD02AC']}]
Это не устойчиво к переупорядочению входного списка.
Кроме того, если во входных данных есть некоторый «пробел», например, если
"AD01"
не имеет соответствующих записей 'rphy', он выдаст
StopIteration
ошибка, как вы выяснили. В этом случае вы можете использовать более традиционный подход:
from itertools import groupby
my_list= ["AD01", "AD02", "AD02AA", "AD02AB", "AD02AC"]
output = []
for item in my_list:
if len(item) == 4:
dct = {'Legacy': item, 'rphy': []}
output.append(dct)
else:
dct['rphy'].append(item)
print(output)
# [{'Legacy': 'AD01', 'rphy': []}, {'Legacy': 'AD02', 'rphy': ['AD02AA', 'AD02AB', 'AD02AC']}]