Python:基于另一个列表将列表拆分为更小的JSON

Python:基于另一个列表将列表拆分为更小的JSON,python,list,python-3.x,Python,List,Python 3.x,我有一个程序名列表,需要根据优先级列表将其排序为较小的JSON列表。我需要在Python3中执行此操作。 B和C具有相同的优先级2,它们将一起列在列表中 program_names = ['A','B','C','D'] priorities = [1,2,2,3] 要求的最终结果: [[{"name": "A"}], [{"name":"B"}, {"name":"C"}], [{"name":"D"}]] 当前代码: program_names_list = [] final_l

我有一个程序名列表,需要根据优先级列表将其排序为较小的JSON列表。我需要在Python3中执行此操作。 B和C具有相同的优先级2,它们将一起列在列表中

program_names = ['A','B','C','D']
priorities = [1,2,2,3]
要求的最终结果:

[[{"name": "A"}], [{"name":"B"}, {"name":"C"}], [{"name":"D"}]]
当前代码:

program_names_list = []
    final_list = []
    for x in program_names.split(','):
        program_names_list.append(x)
    for x in program_names_list:
        final_list.append([{"name": x}])
这就是我目前得到的结果,输出结果如下:

[[{'name': 'A'}], [{'name': 'B'}], [{'name': 'C'}], [{'name': 'D'}]]
我应该补充一点,程序名是一个字符串“a,B,C,D”

完整解决方案 返回:

[[{'name': 'A'}], [{'name': 'B'}, {'name': 'C'}], [{'name': 'D'}]]    
步调一致 创建一个字典,使用优先级作为键,并创建一个所有程序名的列表,其中相应的优先级作为值:

items = {}
for k, v in zip(priorities, program_names):
    items.setdefault(k, []).append(v)
通过按键从字典中获取程序名,浏览已排序的键并创建一个新的程序名列表:

[[{'name': name} for name in items[key]] for key in sorted(items.keys())]
全解 返回:

[[{'name': 'A'}], [{'name': 'B'}, {'name': 'C'}], [{'name': 'D'}]]    
步调一致 创建一个字典,使用优先级作为键,并创建一个所有程序名的列表,其中相应的优先级作为值:

items = {}
for k, v in zip(priorities, program_names):
    items.setdefault(k, []).append(v)
通过按键从字典中获取程序名,浏览已排序的键并创建一个新的程序名列表:

[[{'name': name} for name in items[key]] for key in sorted(items.keys())]

循环遍历优先级,并使用优先级为键、程序列表为值的字典对具有相同优先级的所有元素进行分组

In [24]: from collections import defaultdict

In [25]: program_names = ['A','B','C','D']

In [26]: priorities = [1,2,2,3]

In [27]: d = defaultdict(list)

In [28]: for i, p in enumerate(sorted(priorities)):
    d[p].append({'name': program_names[i]})
   ....:

In [29]: list(d.values())
Out[29]: [[{'name': 'A'}], [{'name': 'B'}, {'name': 'C'}], [{'name': 'D'}]]

循环遍历优先级,并使用优先级为键、程序列表为值的字典对具有相同优先级的所有元素进行分组

In [24]: from collections import defaultdict

In [25]: program_names = ['A','B','C','D']

In [26]: priorities = [1,2,2,3]

In [27]: d = defaultdict(list)

In [28]: for i, p in enumerate(sorted(priorities)):
    d[p].append({'name': program_names[i]})
   ....:

In [29]: list(d.values())
Out[29]: [[{'name': 'A'}], [{'name': 'B'}, {'name': 'C'}], [{'name': 'D'}]]

虽然从教育的角度来看这可能是错误的,但我还是忍不住用一句话来回答这些问题:

[[{'name': p_n} for p_i, p_n in zip(priorities, program_names) if p_i == p] for p in sorted(set(priorities))]
(这假设您的“优先级”列表可能已排序,并且效率低于使用
defaultdict(list)
的“正常”方法)

更新:借用该死的c-s答案,这里有一个有效的一行代码(不包括itertools import groupby的隐含
):


虽然从教育的角度来看这可能是错误的,但我还是忍不住用一句话来回答这些问题:

[[{'name': p_n} for p_i, p_n in zip(priorities, program_names) if p_i == p] for p in sorted(set(priorities))]
(这假设您的“优先级”列表可能已排序,并且效率低于使用
defaultdict(list)
的“正常”方法)

更新:借用该死的c-s答案,这里有一个有效的一行代码(不包括itertools import groupby的隐含
):

使用groupby

from itertools import groupby

program_names = ['a','b','c','d']
priorities = [1,2,2,3]

data = zip(priorities, program_names)

groups_dict = []
for k, g in groupby(data, lambda x: x[0]):
    m = map(lambda x: dict(name=x[1]), list(g))
    groups_dict.append(m)

print(groups_dict)
使用groupby

from itertools import groupby

program_names = ['a','b','c','d']
priorities = [1,2,2,3]

data = zip(priorities, program_names)

groups_dict = []
for k, g in groupby(data, lambda x: x[0]):
    m = map(lambda x: dict(name=x[1]), list(g))
    groups_dict.append(m)

print(groups_dict)

到目前为止你做了什么?这不是一个代码编写服务,你知道在哪里你会告诉需求,有人会为你编写代码you@NSNoob-添加了我当前的代码-见上文。到目前为止,您做了什么?这不是一个代码编写服务,你知道在哪里你会告诉需求,有人会为你编写代码you@NSNoob-添加了我的当前代码-请参见上文。@user4659009只要将其转换为列表,我就更新了答案。这是因为python3没有返回dict.values的列表。@user4659009只要将其转换为列表,我就更新了答案。这是因为python3不返回dict.values的列表。