我编写了一个代码来执行一些简单的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作为第0个元素。我也希望代码输出最后一个“作业”集。最后有没有人有任何改进此代码的建议?
我问,因为我希望在编写代码方面做得更好,而不是仅仅将它们混合在一起。任何回复将不胜感激! 提前致谢
答案 0 :(得分: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']]
答案 1 :(得分: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)