英文:
List of dictionaries: Sort elements and insert sum
问题
以下是已经翻译好的代码部分:
我有一个类似这样无序的字典列表:
[{ 'A': 'LabelA', 'B': 'DescriptionA', 'C': '1', 'D': '5', 'sum': '0' },
{ 'A': 'LabelB', 'B': 'DescriptionB', 'C': '2', 'D': '6', 'sum': '0' },
{ 'A': 'LabelB', 'B': 'DescriptionB', 'C': '3', 'D': '7', 'sum': '0' },
{ 'A': 'LabelA', 'B': 'DescriptionA', 'C': '4', 'D': '8', 'sum': '0' }]
我想首先对它进行排序,然后在前面添加一个总和,像这样:
[{ 'A': 'LabelA', 'B': 'DescriptionA', 'C': '5', 'D': '13', 'sum': '1' },
{ 'A': 'LabelA', 'B': 'DescriptionA', 'C': '1', 'D': '5', 'sum': '0' },
{ 'A': 'LabelA', 'B': 'DescriptionA', 'C': '4', 'D': '8', 'sum': '0' },
{ 'A': 'LabelB', 'B': 'DescriptionB', 'C': '5', 'D': '13', 'sum': '1' },
{ 'A': 'LabelB', 'B': 'DescriptionB', 'C': '2', 'D': '6', 'sum': '0' },
{ 'A': 'LabelB', 'B': 'DescriptionB', 'C': '3', 'D': '7', 'sum': '0' }]
希望这可以帮助您理解如何对列表进行排序并添加总和。
英文:
I have a list of dictionaries in an unstructured order like this:
[{'A': 'LabelA', 'B': 'DescriptionA', 'C': '1', 'D': '5', 'sum': '0'},
{'A': 'LabelB', 'B': 'DescriptionB', 'C': '2', 'D': '6', 'sum': '0'},
{'A': 'LabelB', 'B': 'DescriptionB', 'C': '3', 'D': '7', 'sum': '0'},
{'A': 'LabelA', 'B': 'DescriptionA', 'C': '4', 'D': '8', 'sum': '0'}
]
and I want to sort it first and add a sum in front of it like this:
[{'A': 'LabelA', 'B': 'DescriptionA', 'C': '5', 'D': '13', 'sum': '1'},
{'A': 'LabelA', 'B': 'DescriptionA', 'C': '1', 'D': '5', 'sum': '0'},
{'A': 'LabelA', 'B': 'DescriptionA', 'C': '4', 'D': '8', 'sum': '0'},
{'A': 'LabelB', 'B': 'DescriptionB', 'C': '5', 'D': '13', 'sum': '1'},
{'A': 'LabelB', 'B': 'DescriptionB', 'C': '2', 'D': '6', 'sum': '0'},
{'A': 'LabelB', 'B': 'DescriptionB', 'C': '3', 'D': '7', 'sum': '0'}
]
I have followed multiple tutorials how to loop through the list to either sort it or to create a sum, but I don't have any clue how to a) do both and b) add the sum at the right position.
答案1
得分: 0
以下是您要的代码部分的翻译:
那么,看起来您想要按 `A` 列的值进行分组。所以,只需使用常规的分组方法:
data = [{'A': 'LabelA', 'B': 'DescriptionA', 'C': '1', 'D': '5', 'sum': '0'},
{'A': 'LabelB', 'B': 'DescriptionB', 'C': '2', 'D': '6', 'sum': '0'},
{'A': 'LabelB', 'B': 'DescriptionB', 'C': '3', 'D': '7', 'sum': '0'},
{'A': 'LabelA', 'B': 'DescriptionA', 'C': '4', 'D': '8', 'sum': '0'}]
grouper = {}
for row in data:
grouper.setdefault(row['A'], []).append(row)
这将给您:
from pprint import pprint
pprint(grouper)
{'LabelA': [{'A': 'LabelA',
'B': 'DescriptionA',
'C': '1',
'D': '5',
'sum': '0'},
{'A': 'LabelA',
'B': 'DescriptionA',
'C': '4',
'D': '8',
'sum': '0'}],
'LabelB': [{'A': 'LabelB',
'B': 'DescriptionB',
'C': '2',
'D': '6',
'sum': '0'},
{'A': 'LabelB',
'B': 'DescriptionB',
'C': '3',
'D': '7',
'sum': '0'}]}
然后,遍历分组以填充最终列表。首先计算“sum”,追加该值,然后追加分组。
首先,我会定义一个小的辅助函数:
def _add_rows(row1, row2):
row1['C'] = str(int(row1['C']) + int(row2['C']))
row1['D'] = str(int(row1['D']) + int(row2['D']))
然后,记得将 sum
设置为 '1'
。所以类似这样:
final = []
for (first, *rest) in grouper.values():
row_sum = first.copy()
row_sum['sum'] = '1'
for row in rest:
_add_rows(row_sum, row)
final.append(row_sum)
final.append(first)
final.extend(rest)
这将得到:
[{'A': 'LabelA', 'B': 'DescriptionA', 'C': '5', 'D': '13', 'sum': '1'},
{'A': 'LabelA', 'B': 'DescriptionA', 'C': '1', 'D': '5', 'sum': '0'},
{'A': 'LabelA', 'B': 'DescriptionA', 'C': '4', 'D': '8', 'sum': '0'},
{'A': 'LabelB', 'B': 'DescriptionB', 'C': '5', 'D': '13', 'sum': '1'},
{'A': 'LabelB', 'B': 'DescriptionB', 'C': '2', 'D': '6', 'sum': '0'},
{'A': 'LabelB', 'B': 'DescriptionB', 'C': '3', 'D': '7', 'sum': '0'}]
请注意,我将键 C
、D
和 sum
保持为字符串,但它们实际上应该是 int
对象。
英文:
So, it looks like you want to group the values by 'A'
. So just use the regular grouping idiom:
>>> data = [{'A': 'LabelA', 'B': 'DescriptionA', 'C': '1', 'D': '5', 'sum': '0'},
... {'A': 'LabelB', 'B': 'DescriptionB', 'C': '2', 'D': '6', 'sum': '0'},
... {'A': 'LabelB', 'B': 'DescriptionB', 'C': '3', 'D': '7', 'sum': '0'},
... {'A': 'LabelA', 'B': 'DescriptionA', 'C': '4', 'D': '8', 'sum': '0'}
... ]
>>> grouper = {}
>>> for row in data:
... grouper.setdefault(row['A'],[]).append(row)
...
This gives you:
>>> from pprint import pprint
>>> pprint(grouper)
{'LabelA': [{'A': 'LabelA',
'B': 'DescriptionA',
'C': '1',
'D': '5',
'sum': '0'},
{'A': 'LabelA',
'B': 'DescriptionA',
'C': '4',
'D': '8',
'sum': '0'}],
'LabelB': [{'A': 'LabelB',
'B': 'DescriptionB',
'C': '2',
'D': '6',
'sum': '0'},
{'A': 'LabelB',
'B': 'DescriptionB',
'C': '3',
'D': '7',
'sum': '0'}]}
Then, iterate over the groups to populate your final list. First calculating the "sum", appending that, then appending the group.
First, I would define a little helper function:
>>> def _add_rows(row1, row2):
... row1['C'] = str(int(row1['C']) + int(row2['C']))
... row1['D'] = str(int(row1['D']) + int(row2['D']))
...
Then remember to set 'sum'
to '1'
. So something like:
>>> final = []
>>> for (first, *rest) in grouper.values():
... row_sum = first.copy()
... row_sum['sum'] = '1'
... for row in rest:
... _add_rows(row_sum, row)
... final.append(row_sum)
... final.append(first)
... final.extend(rest)
...
>>> pprint(final)
[{'A': 'LabelA', 'B': 'DescriptionA', 'C': '5', 'D': '13', 'sum': '1'},
{'A': 'LabelA', 'B': 'DescriptionA', 'C': '1', 'D': '5', 'sum': '0'},
{'A': 'LabelA', 'B': 'DescriptionA', 'C': '4', 'D': '8', 'sum': '0'},
{'A': 'LabelB', 'B': 'DescriptionB', 'C': '5', 'D': '13', 'sum': '1'},
{'A': 'LabelB', 'B': 'DescriptionB', 'C': '2', 'D': '6', 'sum': '0'},
{'A': 'LabelB', 'B': 'DescriptionB', 'C': '3', 'D': '7', 'sum': '0'}]
Note, I kept keys 'C'
, 'D'
, and 'sum'
as strings, but they really should be int
objects.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论