1

我在文件“temp”中有一个单词列表:

 1. the 
 2. of
 3. to
 4. and
 5. bank

等等

我如何提高它的可读性?

import itertools
f = open("temp.txt","r")
lines = f.readlines()
pairs = list(itertools.permutations(lines, 2))
print(pairs)

我迷路了,请帮助。

4

3 回答 3

4
import itertools

with open("temp.txt", "r") as f:
    words = [item.split(' ')[-1].strip() for item in f]

pairs = list(itertools.permutations(words, 2))
print(pairs)

打印(pprint用于可读性):

[('the', 'of'),
 ('the', 'to'),
 ('the', 'and'),
 ('the', 'bank'),
 ('of', 'the'),
 ('of', 'to'),
 ('of', 'and'),
 ('of', 'bank'),
 ('to', 'the'),
 ('to', 'of'),
 ('to', 'and'),
 ('to', 'bank'),
 ('and', 'the'),
 ('and', 'of'),
 ('and', 'to'),
 ('and', 'bank'),
 ('bank', 'the'),
 ('bank', 'of'),
 ('bank', 'to'),
 ('bank', 'and')]
于 2013-06-08T21:05:31.057 回答
3

我假设您的问题是创建temp文件中定义的所有可能的单词对。这称为排列,您已经在使用该itertools.permutations函数

如果您需要实际将输出写入文件,您的代码应如下所示:

编码:

import itertools
f = open("temp","r")
lines = [line.split(' ')[-1].strip() for line in f] #1
pairs = list(itertools.permutations(lines, 2)) #2
r = open('result', 'w') #3
r.write("\n".join([" ".join(p) for p in pairs])) #4
r.close() #5
  1. [line.split(' ')[-1].strip() for line in f]读取整个文件,对于每个读取的行,它将围绕空格字符拆分,选择行的最后一项(负索引,如-1在列表中向后走),删除任何尾随空格(如\n)并将所有一个列表中的行
  2. 对像您已经生成的那样生成,但现在它们没有尾随\n
  3. 打开result文件进行写入
  4. 加入由空格 ( ) 分隔的对,用 a" "加入每个结果(一行),\n然后写入文件
  5. 关闭文件(从而刷新它)
于 2013-06-08T21:18:20.243 回答
2

一些改进与解释

import itertools

with open('temp.txt', 'r') as fobj_in, open('out.txt', 'w') as fobj_out:
    words = (item.split()[-1] for item in fobj_in if item.strip())
    for pair in itertools.permutations(words, 2):
        fobj_out.write('{} {}\n'.format(*pair))

解释

with open('temp.txt', 'r') as fobj_in, open('out.txt', 'w') as fobj_out:

我们打开两个文件,一个用于阅读,一个在with. 这保证了一旦我们离开块的缩进,这两个文件都将被关闭,with即使该块中的某处存在异常也是如此。

我们使用列表推导来获取所有单词:

words = [item.split()[-1] for item in fobj_in if item.strip()]

item.split()[-1]剥离任何空白并为我们提供行中的最后一个条目。请注意,它还会\n在每行的末尾取消。这里不需要.strip()item.split()通常比item.split(' ')因为它也适用于多个空格和制表符。我们仍然需要确保该行不为空if item.strip()。如果在删除所有空格后什么都没有留下,那么我们就没有单词了,并且item.split()[-1]会给出索引错误。只需转到下一行并丢弃这一行。

现在我们可以遍历所有对并将它们写入输出文件:

for pair in itertools.permutations(words, 2):
    fobj_out.write('{} {}\n'.format(*pair))

我们要求迭代器一次给我们下一个词对,并将这一对写入输出文件。无需将其转换为列表。将.format(*pair)两个元素解包pair并等效.format(pair[0], pair[1])于我们的带有两个元素的对。

性能说明

第一个直觉可能是使用生成器表达式来从文件中读取单词:

words = (item.split()[-1] for item in fobj_in if item.strip())

但是时间测量表明列表理解比生成器表达式更快。这是由于无论如何都itertools.permutations(words)使用了迭代器。words首先创建一个列表可以避免再次遍历所有元素的双重努力。

于 2013-06-08T22:24:32.953 回答