1

输入

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 进行分组。
  • 元素的顺序并不重要(可以是任何顺序)。
  • 然后,任何后续列都由分隔符连接;
  • 除了第一列,所有其他列都是字符串字段。
4

3 回答 3

1

我不知道性能,但我可能会使用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']]

这假定列表在子列表的第一个元素中是连续的。如果没有,那么您需要更换groupbyby

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(..))。)
于 2013-10-17T14:57:17.530 回答
1
from collections import defaultdict

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

dd = defaultdict(lambda: [[], []])

for key, s0, s1 in a:
    dd[key][0].append(s0)
    dd[key][1].append(s1)

a = [[key, ';'.join(dd[key][0]), ';'.join(dd[key][1])] for key in dd]

for elem in a:
    print elem

输出:

[1, 'abc;def', '123;456']
[2, 'ghi;jkl;mno', '789;012;345']
[3, 'pqr', '678']
于 2013-10-17T16:07:07.497 回答
0

这是我到目前为止所能得到的,如果有人可以在这段代码上抛出一些代码,那就太好了:

a = [
        [1, 'abc', '123'],
        [1, 'def', '456'],
        [2, 'ghi', '789'],
        [2, 'jkl', '012'],
        [2, 'mno', '345'],
        [3, 'pqr', '678']
    ]
    count = 2
    index = 1
    prev_val = a[index][0]
    output = []
    first_ele = a[0]

while index < len(a)+1:
    if prev_val == count:
        output[first_ele][1] += ';' + a[index][1] + str(a[index][2])
    else:
        count += 1
        index += 1`
于 2013-10-17T16:13:39.233 回答