2

我编写了一个代码来执行一些简单的 csv 格式,但我知道它并没有它可能的那么好。

这是输入

1,a
1,b
1,c
2,d
2,e
3,a
3,d
3,e
3,f

这是我想要的输出

['1','a','b','c']
['2','d','e']
['3','a','d','e','f']

这是我写的代码

import csv
input = csv.reader(open('book1.csv'))
output = open('output.csv', 'w')
job=[0,0]
for row in input:
    if row[0] == job[1]:
        job.append(row[1])
    else:
        print(job)
        #output.write(",".join(job))
        job[1] = row[0]
        job = [job[0], job[1]]
        job.append(row[1])

这是输出

[0,0]
[0, '1', 'a', 'b', 'c']
[0, '2', 'd', 'e']

我的问题如下

如何完成该行的 else 语句?另外,我怎样才能摆脱添加 0 作为集合中的第零个元素。我还希望代码输出最后一个“作业”集。最后,有人对改进此代码有任何建议吗?

我问是因为我想在编写代码方面做得更好,而不是仅仅将代码拼凑在一起。任何回应将不胜感激!提前致谢

4

2 回答 2

2

您要做的是将第二列按第一列分组。Python为此提供了一个工具itertools.groupby

groups = itertools.groupby(input, key=operator.itemgetter(0))

是产生(key, group)元组的迭代器,其中key是行中的第一项,每个group是组中行的迭代器。

operator.itemgetter[]与语法 做同样的事情——获取指定的项目。operator.itemgetter(0)是相同的:

def itemgetter_0(seq_or_mapping):
    return seq_or_mapping[0]

要提取值并创建列表,您可以:

output = [[key] + map(operator.itemgetter(1), group) for key, group in groups]

它以 开头每个列表,key然后从每行中提取第二项并将它们添加到列表中。

对于您的示例输入,输出将是:

[['1', 'a', 'b', 'c'], ['2', 'd', 'e'], ['3', 'a', 'd', 'e', 'f']]
于 2012-05-12T19:29:47.093 回答
1

为了“在编写代码方面做得更好”,您需要能够编写和理解基本代码,以及知道如何拨打快递groupby或其他任何东西。

尝试回答您提出的实际问题,以下是使您的代码正常工作所需的最小更改:

import csv
input = csv.reader(open('book1.csv'))
output = open('output.csv', 'w')
job = []
for row in input:
    if not job: # first row in input file
        job = row
    elif row[0] == job[0]:
        job.append(row[1])
    else:
        print(job)
        #output.write(",".join(job))
        job = row
if job: # emit the last job (if any)
    print(job)
于 2012-05-12T23:17:11.093 回答