Python:基于另一个列表将列表拆分为更小的JSON
我有一个程序名列表,需要根据优先级列表将其排序为较小的JSON列表。我需要在Python3中执行此操作。 B和C具有相同的优先级2,它们将一起列在列表中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
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的列表。