Предположим, что у меня есть список на Python, который может быть довольно длинным:
mylist = [{"a": 2}, {"a": 4}, {"b": 3}, {"a": 3}, ..., {"a": 5}]
У меня есть функция, которая для каждого элемента возвращает «группу» (None, когда элемент не входит в группу)
def get_group(element):
a_value = element.get("a", None)
if a_value is not None:
return "EVEN" if a_value % 2 == 0 else "ODD"
return None
Я ищу краткий, питонический и алгоритмически эффективный способ реализации этого. У меня есть первая версия ниже. Есть ли какая-либо функция или структура данных в стандартной библиотеке Python, которая помогла бы мне реализовать это более лаконично, не жертвуя сложностью алгоритма?
def get_first_n_by_group(list_, n, group_function, n_groups):
trimmed_list = list()
max_elements = n * n_groups
nb_elements_per_group = defaultdict(int)
for element in list_:
group = group_function(element)
if group is not None and nb_elements_per_group[group] < n:
trimmed_list.append(element)
nb_elements_per_group[group] += 1
if len(trimmed_list) == max_elements:
break
return trimmed_list
Подробнее здесь: https://stackoverflow.com/questions/789 ... ython-list