如何从列表中创建单词对列表

时间:2013-06-08 20:57:54

标签: python list

我在“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)

我迷路了,请帮帮忙。

3 个答案:

答案 0 :(得分: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')]

答案 1 :(得分:3)

我假设您的问题是创建temp文件中定义的所有可能的单词对。这称为permutation,您已使用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]将读取整个文件,对于每个readed行,它会将其拆分为空格字符,选择该行的最后一项(负{@ 1}}等负索引在列表中向后移动),删除任何尾随空格(如-1)并将所有行放在一个列表中
  2. 生成的对象就像您已经生成的一样,但现在他们没有跟踪\n
  3. 打开\n文件进行编写
  4. 加入由空格(result)分隔的对,将每个结果(一行)与" "连接,然后写入文件
  5. 关闭文件(因此将其刷新)

答案 2 :(得分: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。首先创建一个列表可以避免再次遍历所有元素的双倍努力。