Мне нужно разбить массив на подмассивы с одинаковыми значениями в python
Предположим, что у меня есть следующее queryset_array:
queryset_array = [{"category":"a"},{"category":"a"},{"category:"b"},{"category":"b"},{"category":"c"},{"category":"c"}]
Как я могу преобразовать этот массив наиболее эффективным питоновским способом в:
array_1 = [{"category":"a"},{"category":a"}}]
array_2 = [{"category":"b"},{"category":"b"}]
array_3 = [{"category":"c"},{"category":"c"}]
Прежде всего, ваш диктант недействителен.
Полагаю, вы забыли кавычки в {"category: "b"}, что выглядело бы следующим образом:
[{"category":"a"},{"category":"a"},{"category":"b"},{"category":"b"},{"category":"c"}, {"category":"c"}]
Во-вторых, чтобы сделать именно то, что вы ищете, вы можете сделать следующее:
array_1 = (queryset_array[1], queryset_array[2])
array_2 = (queryset_array[3], queryset_array[4])
array_3 = (queryset_array[5], queryset_array[6])
но это будет работать, только если ваш queryset_array содержит ровно 6 значений.
Если вы хотите сделать ваш код более общим, вы можете использовать следующее:
queryset_array = [{"category":"a"},{"category":"a"},{"category":"b"},{"category":"b"},{"category":"c"}, {"category":"c"}]
queryset_array2 = []
for x in range(len(queryset_array)):
if x % 2 == 0:
queryset_array2.append([queryset_array[x], queryset_array[x+1]])
Или если входные данные организованы иначе:
queryset_array = [{"category": "b"},{"category": "a"},{"category": "b"},{"category": "b"},{"category": "c"},{"category": "d"}]
queryset_array2 = {}
for item in queryset_array:
if item["category"] not in queryset_array2.keys():
queryset_array2[item["category"]] = []
queryset_array2[item["category"]].append(item)
Попробуйте это:
from itertools import groupby
queryset_array = [{"category": "b"}, {"category": "a"}, {"category": "b"}, {"category": "b"}, {"category": "c"},
{"category": "d"}]
def key_func(k):
return k['category']
sorted_data = sorted(queryset_array, key=key_func)
count = 1
for key, value in groupby(sorted_data , key_func):
print(f'array_{count}= {list(value)}')
count += 1
Выход
array_1= [{'category': 'a'}]
array_2= [{'category': 'b'}, {'category': 'b'}, {'category': 'b'}]
array_3= [{'category': 'c'}]
array_4= [{'category': 'd'}]
Следующий другой ответ без использования какой-либо библиотеки. Я изменил queryset_array, чтобы проверить, работает ли он нормально. Я также создал словарь desired_dictionary, состоящий из array_x ключей.
queryset_array = [{"category":"a"}, {"category":"a"},{"category":"a"}, {"category":"a"},{"category":"b"},{"category":"b"},{"category":"c"},{"category":"a"}, {"category":"b"}, {"category":"c"}, {"category":"c"},{"category":"b"},{"category":"c"}, {"category":"d"}]
def my_fnc(k):
return k['category']
sorted_queryset_array = sorted(queryset_array, key=my_fnc)
j = 1
values_dictionary = {}
desired_dictionary = {}
for i in sorted_queryset_array: # creating values_dictionary which includes values and how many times encountered.
for k,v in i.items():
val = f"value_{v}"
if val in values_dictionary:
j = j + 1
values_dictionary[val] = j
if val not in values_dictionary:
values_dictionary[val] = 1
j = 1
w = 1
desired_list = []
for k,v in values_dictionary.items():
values = k.split("_")
variable = f"array_{w}"
for p in range(0,v):
desired_list.append({"category": values[1]}) # This list desired_list is the desired data.
desired_dictionary[variable] = desired_list # Creating a dict with array_x values.
desired_list = []
w = w + 1
print(desired_dictionary)
# for k,v in desired_dictionary.items():
# print(v)
Смотрите следующий вывод:
