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

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

List of dictionaries: Sort elements and insert sum

问题

以下是已经翻译好的代码部分:

  1. 我有一个类似这样无序的字典列表:
  2. [{ 'A': 'LabelA', 'B': 'DescriptionA', 'C': '1', 'D': '5', 'sum': '0' },
  3. { 'A': 'LabelB', 'B': 'DescriptionB', 'C': '2', 'D': '6', 'sum': '0' },
  4. { 'A': 'LabelB', 'B': 'DescriptionB', 'C': '3', 'D': '7', 'sum': '0' },
  5. { 'A': 'LabelA', 'B': 'DescriptionA', 'C': '4', 'D': '8', 'sum': '0' }]
  6. 我想首先对它进行排序然后在前面添加一个总和像这样:
  7. [{ 'A': 'LabelA', 'B': 'DescriptionA', 'C': '5', 'D': '13', 'sum': '1' },
  8. { 'A': 'LabelA', 'B': 'DescriptionA', 'C': '1', 'D': '5', 'sum': '0' },
  9. { 'A': 'LabelA', 'B': 'DescriptionA', 'C': '4', 'D': '8', 'sum': '0' },
  10. { 'A': 'LabelB', 'B': 'DescriptionB', 'C': '5', 'D': '13', 'sum': '1' },
  11. { 'A': 'LabelB', 'B': 'DescriptionB', 'C': '2', 'D': '6', 'sum': '0' },
  12. { 'A': 'LabelB', 'B': 'DescriptionB', 'C': '3', 'D': '7', 'sum': '0' }]

希望这可以帮助您理解如何对列表进行排序并添加总和。

英文:

I have a list of dictionaries in an unstructured order like this:

  1. [{'A': 'LabelA', 'B': 'DescriptionA', 'C': '1', 'D': '5', 'sum': '0'},
  2. {'A': 'LabelB', 'B': 'DescriptionB', 'C': '2', 'D': '6', 'sum': '0'},
  3. {'A': 'LabelB', 'B': 'DescriptionB', 'C': '3', 'D': '7', 'sum': '0'},
  4. {'A': 'LabelA', 'B': 'DescriptionA', 'C': '4', 'D': '8', 'sum': '0'}
  5. ]

and I want to sort it first and add a sum in front of it like this:

  1. [{'A': 'LabelA', 'B': 'DescriptionA', 'C': '5', 'D': '13', 'sum': '1'},
  2. {'A': 'LabelA', 'B': 'DescriptionA', 'C': '1', 'D': '5', 'sum': '0'},
  3. {'A': 'LabelA', 'B': 'DescriptionA', 'C': '4', 'D': '8', 'sum': '0'},
  4. {'A': 'LabelB', 'B': 'DescriptionB', 'C': '5', 'D': '13', 'sum': '1'},
  5. {'A': 'LabelB', 'B': 'DescriptionB', 'C': '2', 'D': '6', 'sum': '0'},
  6. {'A': 'LabelB', 'B': 'DescriptionB', 'C': '3', 'D': '7', 'sum': '0'}
  7. ]

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

以下是您要的代码部分的翻译:

  1. 那么看起来您想要按 `A` 列的值进行分组所以只需使用常规的分组方法
  2. data = [{'A': 'LabelA', 'B': 'DescriptionA', 'C': '1', 'D': '5', 'sum': '0'},
  3. {'A': 'LabelB', 'B': 'DescriptionB', 'C': '2', 'D': '6', 'sum': '0'},
  4. {'A': 'LabelB', 'B': 'DescriptionB', 'C': '3', 'D': '7', 'sum': '0'},
  5. {'A': 'LabelA', 'B': 'DescriptionA', 'C': '4', 'D': '8', 'sum': '0'}]
  6. grouper = {}
  7. for row in data:
  8. grouper.setdefault(row['A'], []).append(row)

这将给您:

  1. from pprint import pprint
  2. pprint(grouper)
  3. {'LabelA': [{'A': 'LabelA',
  4. 'B': 'DescriptionA',
  5. 'C': '1',
  6. 'D': '5',
  7. 'sum': '0'},
  8. {'A': 'LabelA',
  9. 'B': 'DescriptionA',
  10. 'C': '4',
  11. 'D': '8',
  12. 'sum': '0'}],
  13. 'LabelB': [{'A': 'LabelB',
  14. 'B': 'DescriptionB',
  15. 'C': '2',
  16. 'D': '6',
  17. 'sum': '0'},
  18. {'A': 'LabelB',
  19. 'B': 'DescriptionB',
  20. 'C': '3',
  21. 'D': '7',
  22. 'sum': '0'}]}

然后,遍历分组以填充最终列表。首先计算“sum”,追加该值,然后追加分组。

首先,我会定义一个小的辅助函数:

  1. def _add_rows(row1, row2):
  2. row1['C'] = str(int(row1['C']) + int(row2['C']))
  3. row1['D'] = str(int(row1['D']) + int(row2['D']))

然后,记得将 sum 设置为 '1'。所以类似这样:

  1. final = []
  2. for (first, *rest) in grouper.values():
  3. row_sum = first.copy()
  4. row_sum['sum'] = '1'
  5. for row in rest:
  6. _add_rows(row_sum, row)
  7. final.append(row_sum)
  8. final.append(first)
  9. final.extend(rest)

这将得到:

  1. [{'A': 'LabelA', 'B': 'DescriptionA', 'C': '5', 'D': '13', 'sum': '1'},
  2. {'A': 'LabelA', 'B': 'DescriptionA', 'C': '1', 'D': '5', 'sum': '0'},
  3. {'A': 'LabelA', 'B': 'DescriptionA', 'C': '4', 'D': '8', 'sum': '0'},
  4. {'A': 'LabelB', 'B': 'DescriptionB', 'C': '5', 'D': '13', 'sum': '1'},
  5. {'A': 'LabelB', 'B': 'DescriptionB', 'C': '2', 'D': '6', 'sum': '0'},
  6. {'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:

  1. >>> data = [{'A': 'LabelA', 'B': 'DescriptionA', 'C': '1', 'D': '5', 'sum': '0'},
  2. ... {'A': 'LabelB', 'B': 'DescriptionB', 'C': '2', 'D': '6', 'sum': '0'},
  3. ... {'A': 'LabelB', 'B': 'DescriptionB', 'C': '3', 'D': '7', 'sum': '0'},
  4. ... {'A': 'LabelA', 'B': 'DescriptionA', 'C': '4', 'D': '8', 'sum': '0'}
  5. ... ]
  6. >>> grouper = {}
  7. >>> for row in data:
  8. ... grouper.setdefault(row['A'],[]).append(row)
  9. ...

This gives you:

  1. >>> from pprint import pprint
  2. >>> pprint(grouper)
  3. {'LabelA': [{'A': 'LabelA',
  4. 'B': 'DescriptionA',
  5. 'C': '1',
  6. 'D': '5',
  7. 'sum': '0'},
  8. {'A': 'LabelA',
  9. 'B': 'DescriptionA',
  10. 'C': '4',
  11. 'D': '8',
  12. 'sum': '0'}],
  13. 'LabelB': [{'A': 'LabelB',
  14. 'B': 'DescriptionB',
  15. 'C': '2',
  16. 'D': '6',
  17. 'sum': '0'},
  18. {'A': 'LabelB',
  19. 'B': 'DescriptionB',
  20. 'C': '3',
  21. 'D': '7',
  22. '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:

  1. >>> def _add_rows(row1, row2):
  2. ... row1['C'] = str(int(row1['C']) + int(row2['C']))
  3. ... row1['D'] = str(int(row1['D']) + int(row2['D']))
  4. ...

Then remember to set 'sum' to '1'. So something like:

  1. >>> final = []
  2. >>> for (first, *rest) in grouper.values():
  3. ... row_sum = first.copy()
  4. ... row_sum['sum'] = '1'
  5. ... for row in rest:
  6. ... _add_rows(row_sum, row)
  7. ... final.append(row_sum)
  8. ... final.append(first)
  9. ... final.extend(rest)
  10. ...
  11. >>> pprint(final)
  12. [{'A': 'LabelA', 'B': 'DescriptionA', 'C': '5', 'D': '13', 'sum': '1'},
  13. {'A': 'LabelA', 'B': 'DescriptionA', 'C': '1', 'D': '5', 'sum': '0'},
  14. {'A': 'LabelA', 'B': 'DescriptionA', 'C': '4', 'D': '8', 'sum': '0'},
  15. {'A': 'LabelB', 'B': 'DescriptionB', 'C': '5', 'D': '13', 'sum': '1'},
  16. {'A': 'LabelB', 'B': 'DescriptionB', 'C': '2', 'D': '6', 'sum': '0'},
  17. {'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:

确定