Мне нужно разбить массив на подмассивы с одинаковыми значениями в 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)

Смотрите следующий вывод:

enter image description here

Вернуться на верх