使用itertools.groupby

时间:2016-12-09 16:09:48

标签: python

我有一个这样的文件:

1     abc
1     def
2     ghi
3     jkl
3     mno
3     pqr

想要从中生成这样的文件:

abc;def
jkl;mno
jkl;pqr
mno;pqr

我有以下代码:

with open('input.txt') as f1:
with open("output.csv", "wb") as f2:
    cw = csv.writer(f2, delimiter=";")
    for l in itertools.groupby((l.split() for l in f1), lambda x: x[0]):
        grouped = set(x[1] for x in l[1])  # set avoids duplicate rows
        for c in itertools.combinations(grouped, 2):
            cw.writerow(c)

但是这段代码不会向输出文件写任何内容。我做错了什么?

1 个答案:

答案 0 :(得分:1)

使用csv.writer在两个字符串之间插入;是一种过度杀伤力。删除后,您的代码可以正常工作。此外,出于开发和发布的目的,使用可迭代的行而不是外部文件作为源,并使用print而不是write进行输出。

import itertools

f1 = '''\
1     abc
1     def
2     ghi
3     jkl
3     mno
3     pqr
'''.splitlines()

for l in itertools.groupby((l.split() for l in f1), lambda x: x[0]):
    grouped = set(x[1] for x in l[1])  # set avoids duplicate rows
    for c in itertools.combinations(grouped, 2):
        print('%s;%s' % c)

打印

abc;def
pqr;mno
pqr;jkl
mno;jkl