循环dict列表并组合具有相同ID的dict

2024-05-17 10:24:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dicts的列表,在那里我需要合并多个包含相同ID键/val的dict。我目前正在做的是不起作用的,它只输出一个新dict,格式正确,但我需要将所有合并的dict放在一个新列表中(或者原地突变,我不太关心这个)。你知道吗

这个列表实际上并没有一个最小值或最大值来表示其中可能存在多少个具有相同ID的dict,它是另一个不同函数的输出。你知道吗

这是我的

词典列表:

# actual ID's are longer and alphanumeric, this is for simplicity.
# dicts with same ID will also have the same 'taskConstraint', 
# but that is a side effect and can't be used as a filter
test_update_list = [
{"ID":"1","taskConstraint": "FIXT","plannedCompletionDate":"2017-07-29","constraintDate":"2017-07-29"},
{"ID":"1","taskConstraint": "FIXT","plannedStartDate":"2017-07-25","constraintDate":"2017-07-25"},
{"ID":"2","taskConstraint": "MSO","plannedCompletionDate":"2017-07-29","constraintDate":"2017-07-29"},
{"ID":"1","taskConstraint": "FIXT","noteText": "Note update text"},
{"ID":"2","taskConstraint": "MSO","noteText": "Note update text"},
{"ID":"3","taskConstraint": "MFO","noteText": "Note update text"},
{"ID":"3","taskConstraint": "MFO","plannedStartDate":"2017-07-25","constraintDate":"2017-07-25"}]

所需输出:

desired_output = [
{"ID":"1","taskConstraint":"FIXT","plannedStartDate":"2017-07-25","constraintDate":"2017-07-25","plannedCompletionDate":"2017-07-29"},
{"ID":"2","taskConstraint": "MSO","plannedCompletionDate":"2017-07-29","constraintDate":"2017-07-29","noteText": "Note update text"},
{"ID":"3","taskConstraint": "MFO","plannedStartDate":"2017-07-25","constraintDate":"2017-07-25","noteText": "Note update text"}]

到目前为止,我糟糕而错误的尝试:

test_update_list = [
{"ID":"1","taskConstraint": "FIXT","plannedCompletionDate":"2017-07-29","constraintDate":"2017-07-29"},
{"ID":"1","taskConstraint": "FIXT","plannedStartDate":"2017-07-25","constraintDate":"2017-07-25"},
{"ID":"2","taskConstraint": "MSO","plannedCompletionDate":"2017-07-29","constraintDate":"2017-07-29"},
{"ID":"1","taskConstraint": "FIXT","noteText": "Note update text"},
{"ID":"2","taskConstraint": "MSO","noteText": "Note update text"},
{"ID":"3","taskConstraint": "MFO","noteText": "Note update text"},
{"ID":"3","taskConstraint": "MFO","plannedStartDate":"2017-07-25","constraintDate":"2017-07-25"}]

new_update_list = []

for task in test_update_list:
    if len(new_update_list) > 0 and task not in new_update_list:
        for new_task in new_update_list:
            if task['ID'] == new_task['ID']:
                new_task = { **task, **new_task }
    else:
        new_update_list.append(task)

print(new_update_list)

输出。。。你知道吗

[{'ID': '1', 'plannedCompletionDate': '2017-07-29', 'constraintDate': '2017-07-29', 'taskConstraint': 'FIXT'}]

Tags: textidnewtaskupdatelistnotemso
1条回答
网友
1楼 · 发布于 2024-05-17 10:24:14

您可以将新数据添加到dict而不是list,其中键将是ID。要获取预期的dict列表,请稍后调用dict上的values()。你知道吗

>>> d = {}    
>>> for dct in test_update_list:
...     d.setdefault(dct['ID'], {}).update(dct)
...

>>> pprint(list(d.values()))
[{'ID': '1',
  'constraintDate': '2017-07-25',
  'noteText': 'Note update text',
  'plannedCompletionDate': '2017-07-29',
  'plannedStartDate': '2017-07-25',
  'taskConstraint': 'FIXT'},
 {'ID': '2',
  'constraintDate': '2017-07-29',
  'noteText': 'Note update text',
  'plannedCompletionDate': '2017-07-29',
  'taskConstraint': 'MSO'},
 {'ID': '3',
  'constraintDate': '2017-07-25',
  'noteText': 'Note update text',
  'plannedStartDate': '2017-07-25',
  'taskConstraint': 'MFO'}]

相关问题 更多 >