簡體   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