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']}]
Другие вопросы по тегам