Я сортирую список словарей по одному из значений dict и хочу иметь отсортированную последовательность вроде 1,2,3,1,2,3,3. Вот что я придумала:
Вход:
dicts = [{'name':'a', 'order':2}, {'name':'b', 'order':2}, {'name':'c', 'order':1}, {'name':'d', 'order':3}, {'name':'e', 'order':3}, {'name':'f', 'order':1}, {'name':'g', 'order':1}]
Функция:
from itertools import groupby, zip_longest
from typing import List
def seq_sort(input: List[dict]) -> List[dict]:
new_seq = []
# order the dicts
ordered = sorted(input, key=lambda x: x['order'])
# group the dicts
group = [
[p for p in v] for k, v in groupby(
ordered,
key=lambda x:x['order']
)
]
# put into new list in sequential order
# grouped lists could be different lengths
for groups in zip_longest(*group):
for g in groups:
if g is not None:
new_seq.append(g)
return new_seq
print(seq_sort(dicts))
Выход:
[{'name': 'c', 'order': 1}, {'name': 'a', 'order': 2}, {'name': 'd', 'order': 3}, {'name': 'f', 'order': 1}, {'name': 'b', 'order': 2}, {'name': 'e', 'order': 3}, {'name':'g', 'order': 1}]
Это работает, но у меня сейчас мозговой туман, и я чувствую, что это не лучший способ сделать это, как мне сделать это лучше?