我需要将数组拆分为 python 中相似值的子数组

I need to split array to sub arrays of similar values in python

假设我有这个 queryset_array:

queryset_array = [{"category":"a"},{"category":"a"},{"category:"b"},{"category":"b"},{"category":"c"},{"category":"c"}]

如何使用最有效的 pythonic 方式将此数组转换为:

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)

查看以下输出: