我编写了一段代码来执行一些简单的 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 作为集合中的第零个元素的情况。我还希望代码能够输出最后一个“作业”集。最后有人对改进这段代码有什么建议吗?
我问这个问题是因为我想更好地编写代码,而不是仅仅将它们拼凑在一起。任何回复将不胜感激! 提前致谢
最佳答案
您想要做的是将第二列按第一列分组。 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']]
关于python - 关于 Python CSV 格式化的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10566586/