繁体   English   中英

从主列表和子列表创建新的字典列表

[英]Create a new list of dictionaries from a main list and a sublist

我有两个列表(主列表和子列表)包含不同数量的字典,如果它们的位置匹配,它们的值将相同。

mainLst = [{"name":"M_AAA_X", "position":"1", "value":"8"}, 
           {"name":"M_AAA_X", "position":"2", "value":"10"}, 
           {"name":"M_AAA_X", "position":"4", "value":"14"}, 
           {"name":"M_AAA_X", "position":"5", "value":"16"},
           {"name":"M_AAA_X", "position":"7", "value":"20"}]
subLst = [{"name":"S_AAA_X", "position":"1", "value":"8"}, 
          {"name":"S_AAA_X", "position":"2", "value":"10"}, 
          {"name":"S_AAA_X", "position":"3", "value":"12"}, 
          {"name":"S_AAA_X", "position":"4", "value":"14"}, 
          {"name":"S_AAA_X", "position":"5", "value":"16"},
          {"name":"S_AAA_X", "position":"6", "value":"18"}]

我想通过以下方式创建一个新列表:

  1. 从 mainLst 中获取元素
  2. 如果 mainLst 缺少某个 position(例如 position:3、6),则从 subList 中获取元素
  3. 按“位置”升序排序

output 应如下所示:

newLst = [{"name":"M_AAA_X", "position":"1", "value":"8"}, 
          {"name":"M_AAA_X", "position":"2", "value":"10"}, 
          {"name":"S_AAA_X", "position":"3", "value":"12"},
          {"name":"M_AAA_X", "position":"4", "value":"14"}, 
          {"name":"M_AAA_X", "position":"5", "value":"16"},
          {"name":"S_AAA_X", "position":"6", "value":"18"},
          {"name":"M_AAA_X", "position":"7", "value":"20"}]

谁能帮我完成这个? 提前致谢!

试试这个。

mainLst.extend([dictSub for dictSub in subLst if dictSub['position'] not in [pos['position'] for pos in mainLst]])
print(sorted(mainLst, key = lambda i: i['position']))

基本上我们收集不在主sublist中的子列表中的mainlist 然后我们根据它对字典列表进行排序。

output

[{'name': 'M_AAA_X', 'position': '1', 'value': '8'}, 
 {'name': 'M_AAA_X', 'position': '2', 'value': '10'}, 
 {'name': 'S_AAA_X', 'position': '3', 'value': '12'}, 
 {'name': 'M_AAA_X', 'position': '4', 'value': '14'}, 
 {'name': 'M_AAA_X', 'position': '5', 'value': '16'}, 
 {'name': 'S_AAA_X', 'position': '6', 'value': '18'}, 
 {'name': 'M_AAA_X', 'position': '7', 'value': '20'}]

另一个解决方案,使用itertools.groupby

from itertools import groupby

out = []
for _, g in groupby(
    sorted(mainLst + subLst, key=lambda k: int(k["position"])),
    lambda k: int(k["position"]),
):
    out.append(next(g))

print(out)

印刷:

[{'name': 'M_AAA_X', 'position': '1', 'value': '8'}, 
 {'name': 'M_AAA_X', 'position': '2', 'value': '10'}, 
 {'name': 'S_AAA_X', 'position': '3', 'value': '12'}, 
 {'name': 'M_AAA_X', 'position': '4', 'value': '14'}, 
 {'name': 'M_AAA_X', 'position': '5', 'value': '16'}, 
 {'name': 'S_AAA_X', 'position': '6', 'value': '18'}, 
 {'name': 'M_AAA_X', 'position': '7', 'value': '20'}]

我有两个列表(主列表和子列表),其中包含不同数量的字典,如果它们的位置匹配,它们的值将相同。

mainLst = [{"name":"M_AAA_X", "position":"1", "value":"8"}, 
           {"name":"M_AAA_X", "position":"2", "value":"10"}, 
           {"name":"M_AAA_X", "position":"4", "value":"14"}, 
           {"name":"M_AAA_X", "position":"5", "value":"16"},
           {"name":"M_AAA_X", "position":"7", "value":"20"}]
subLst = [{"name":"S_AAA_X", "position":"1", "value":"8"}, 
          {"name":"S_AAA_X", "position":"2", "value":"10"}, 
          {"name":"S_AAA_X", "position":"3", "value":"12"}, 
          {"name":"S_AAA_X", "position":"4", "value":"14"}, 
          {"name":"S_AAA_X", "position":"5", "value":"16"},
          {"name":"S_AAA_X", "position":"6", "value":"18"}]

我想通过以下方式创建一个新列表:

  1. 从 mainLst 中获取元素
  2. 如果 mainLst 缺少某个 position(例如 position: 3, 6),则从 subList 中获取元素
  3. 按“位置”升序排序

output 应如下所示:

newLst = [{"name":"M_AAA_X", "position":"1", "value":"8"}, 
          {"name":"M_AAA_X", "position":"2", "value":"10"}, 
          {"name":"S_AAA_X", "position":"3", "value":"12"},
          {"name":"M_AAA_X", "position":"4", "value":"14"}, 
          {"name":"M_AAA_X", "position":"5", "value":"16"},
          {"name":"S_AAA_X", "position":"6", "value":"18"},
          {"name":"M_AAA_X", "position":"7", "value":"20"}]

谁能帮我完成这个? 提前致谢!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM