python - 关于 Python CSV 格式化的建议

标签 python python-3.x

我编写了一段代码来执行一些简单的 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/

相关文章:

python-3.x - 在 PyGame 2 中播放视频

python - Django 管理.py 迁移验证错误

python - 使用 Django 的 post_save() 信号

python - python 中是否有可扩展魔法方法的最佳实践?

python - 为什么当我创建一个新的 worker 时,以前的 celery worker 的任务仍然存在?

python - 使用破折号创建 map 出现语法错误

python - 使用 python 3.4 的 MySQL 更新查询示例

python - 有没有一种更快的方法来创建空数组的元素数组而不使用 for 循环

python - scikit-learn 可以处理多少功能?

python - 如何在Python中求解两个矩阵的方程?