【问题标题】:Python: Split a list into smaller jsons based on another listPython:根据另一个列表将列表拆分为更小的 json
【发布时间】:2015-12-03 20:41:40
【问题描述】:

我有一个程序名称列表,需要根据优先级列表将其分类为较小的 json 列表。我需要在 python 3 中执行此操作。 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'}]]

我应该补充一点,program_names 是一个字符串 "A,B,C,D"

【问题讨论】:

  • 到目前为止你做了什么?这不是一个代码编写服务,你知道你会在哪里告诉需求,然后有人会为你编写代码
  • @NSNoob - 添加了我当前的代码 - 见上文。

标签: python list python-3.x


【解决方案1】:

完整解决方案

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())]

【讨论】:

    【解决方案2】:

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

    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'}]]
    

    【讨论】:

    • @user4659009 只需将其转换为列表,我更新了答案。发生这种情况是因为 python3 没有返回 dict.values 的列表。
    【解决方案3】:

    使用 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)
    

    【讨论】:

      【解决方案4】:

      虽然从教育的角度来看这可能是错误的,但我无法抗拒以单行的方式回答这些问题:

      [[{'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) 的“正常”方法)。

      更新:借用damn_c-s 的答案,这是一个高效的单行代码(不包括隐含的from itertools import groupby):

      [[{'name': pn} for pi, pn in l] for v, l in groupby(zip(priorities, program_names), lambda x: x[0])]
      

      【讨论】:

        猜你喜欢
        • 2015-12-13
        • 2013-11-26
        • 2020-01-14
        • 2021-05-23
        • 1970-01-01
        • 1970-01-01
        • 2014-04-07
        • 1970-01-01
        • 2020-10-07
        相关资源
        最近更新 更多