gpt4 book ai didi

python - 在Python中垂直压平列表列表

转载 作者:行者123 更新时间:2023-12-01 05:34:27 26 4
gpt4 key购买 nike

输入

a = [
[1, 'abc', '123'],
[1, 'def', '456'],
[2, 'ghi', '789'],
[2, 'jkl', '012'],
[2, 'mno', '345'],
[3, 'pqr', '678']
]

实现以下所需输出的最佳方法是什么?请记住,输入列表 a 将会很大(~100K)。

输出

a = [
[1, 'abc;def', '123;456'],
[2, 'ghi;jkl;mno', '789;012;345'],
[3, 'pqr', '678']
]

注意:

  • 元素根据 Column1 进行分组。
  • 元素的顺序并不重要(可以是任何顺序)。
  • 随后的所有列都会通过分隔符 ; 连接起来。
  • 除第一列外,所有其他列都是字符串字段。

最佳答案

我不知道性能如何,但我可能会使用 itertools.groupby 并执行类似的操作[编辑以使每个子列表成为一个平面列表]:

>>> from itertools import groupby
>>> from operator import itemgetter
>>> [[k] + [';'.join(v) for v in zip(*g)[1:]] for k,g in groupby(a, itemgetter(0))]
[[1, 'abc;def', '123;456'], [2, 'ghi;jkl;mno', '789;012;345'], [3, 'pqr', '678']]

这假设列表在子列表的第一个元素中是连续的。如果没有,那么您需要将 groupby 替换为

groupby(sorted(a, key=itemgetter(0)), itemgetter(0))

相反。

上面使用了一些技巧:

  1. groupby,根据键函数的值对可迭代对象中的连续元素进行分组
  2. itemgetter,基本上可以快速获取元素:itemgetter(0) 基本上是一个快速的 lambda x: x[0]
  3. zip(*g),这是通过组合 zip* 元组解包来转置事物的常见习惯用法:zip (*([1,2],[3,4])) == [(1, 3), (2, 4)]。 (无论如何,在 Python 2 中,在 3 中您需要将其设为 list(zip(..))。)

关于python - 在Python中垂直压平列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19430019/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com