2

次のようなCSVファイルがあります。

['Name1'、''、''、''、''、''、''、''、''、''、''、''、''、''、''、''、 ''、''、''、''、'+']
['Name1'、''、''、''、''、''、'b'、''、''、''、 ' '、''、''、''、''、''、''、''、''、''、'']
['Name2'、''、''、''、''、 ' '、''、''、''、''、''、''、''、''、''、''、''、''、''、'a'、'']
[' Name3'、''、''、''、''、' +'、''、''、''、''、''、''、''、''、''、''、''、''、'' 、''、'']

ここで、同じ1番目の列名を持つすべての行を1つの列に結合する方法が必要です。たとえば、次のようになります。

['Name1'、''、''、''、''、''、'b'、''、''、''、''、''、''、''、''、'' 、''、''、''、''、'+']
['Name2'、''、''、''、''、''、''、''、''、''、 ' '、''、''、''、''、''、''、''、''、'a'、'']
['Name3'、''、''、''、''、 '+'、''、''、''、''、''、''、''、''、''、''、''、''、''、''、'']

CSVを並べ替えてから、各行と列を調べて各値を比較することでこれを行う方法を考えることができますが、おそらくもっと簡単な方法があるはずです。

何か案は?

4

3 に答える 3

3

itertools.groupbyを使用する必要があります。

t = [ 
['Name1', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '+'],
['Name1', '', '', '', '', '', 'b', '', '', '', '', '', '', '', '', '', '', '', '', '', ''],
['Name2', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'a', ''],
['Name3', '', '', '', '', '+', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] 
]

from itertools import groupby

# TODO: if you need to speed things up you can use operator.itemgetter
# for both sorting and grouping
for name, rows in groupby(sorted(t), lambda x:x[0]):
    print join_rows(rows)

別の関数でマージを実装することは明らかです。たとえば、次のようになります。

def join_rows(rows):
    def join_tuple(tup):
        for x in tup:
            if x: 
                return x
        else:
            return ''
    return [join_tuple(x) for x in zip(*rows)]
于 2012-06-14T11:43:33.033 に答える
1
def merge_rows(row1, row2):
    # merge two rows with the same name
    merged_row = ...
    return merged_row

r1 = ['Name1', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '+']
r2 = ['Name1', '', '', '', '', '', 'b', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
r3 = ['Name2', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'a', '']
r4 = ['Name3', '', '', '', '', '+', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
rows = [r1, r2, r3, r4]
data = {}
for row in rows:
    name = row[0]
    if name in data:
        data[name] = merge_rows(row, data[name])
    else:
        data[name] = row

dataこれで、このディクショナリの各キーが名前で、対応する値がその行であるすべての行ができました。このデータを CSV ファイルに書き込めるようになりました。

于 2012-06-14T11:25:57.330 に答える
0

次のものも使用できますdefaultdict

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> _ = [d[i[0]].append(z) for i in t for z in i[1:]]
>>> d['Name1']
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '+', '', '', '', '', '', 'b', '', '', '', '', '', '', '', '', '', '', '', '', '', '']

次に、列の結合を行います

于 2012-06-14T12:38:43.817 に答える