列表字典: 排序元素并插入总和

huangapple go评论59阅读模式
英文:

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

请注意,我将键 CDsum 保持为字符串,但它们实际上应该是 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.

huangapple
  • 本文由 发表于 2023年2月16日 07:18:36
  • 转载请务必保留本文链接:https://go.coder-hub.com/75466317.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定