如何使用唯一的单词和顺序重新创建句子

时间:2016-06-10 08:42:25

标签: python python-3.x

我一直在寻找如何编写一个程序,用它的顺序和单个单词重新创建一个句子。

单个单词以这种格式存储在文件中:

i am what so deal with it

并且订单也在一个单独的文件中:

1 2 3 1 2 4 5 6 7

最后它应该成为句子:

>>>i am what i am so deal with it
抱歉,但我无法输入尝试的代码,因为我无法找到如何执行此操作。

4 个答案:

答案 0 :(得分:2)

我会这样做。

In [4]: order = "1 2 3 1 2 4 5 6 7"

In [5]: words = "i am what so deal with it"

In [6]: word_list = words.split()

In [7]: word_list
Out[7]: ['i', 'am', 'what', 'so', 'deal', 'with', 'it']

In [8]: order = map(lambda x: int(x)-1, order.split())

In [9]: order
Out[9]: [0, 1, 2, 0, 1, 3, 4, 5, 6]

In [10]: " ".join([word_list[i] for i in order])
Out[10]: 'i am what i am so deal with it'

我在In [8]: order = map(lambda x: int(x)-1, order.split())中减去1,因为python中的列表从0开始编码。上面的代码使用内置函数(intjoinmapsplit所以请参考Python文档来了解它们究竟是做什么的。

答案 1 :(得分:1)

通常有用的缓解索引不匹配的方法是在字库中添加0索引的虚拟条目(在python代码中),以便从用于构建句子的select索引文件中基于1的索引直接用于构造读取索引文件时的句子序列。

因此我建议尝试:

#! /usr/bin/env python
from __future__ import print_function

word_base = None
with open('so_word_base.txt', 'rt') as f_base:
    word_base = [None] + [z.strip() for z in f_base.read().split()]

sentence_seq = None
with open('so_select_indices.txt', 'rt') as f_select:
    sentence_seq = [word_base[int(i)] for i in f_select.read().split()]

print(' '.join(sentence_seq))

使用单词“atoms”(so_word_base.txt)的文件:

i am what so deal with it

以及用于选择索引到该单词“base”的文件(so_select_indices.txt):

1 2 3 1 2 4 5 6 7

这会产生:

i am what i am so deal with it

请注意,这与建议的其他解决方案一样脆弱,应该没问题,因此OP学习如何实现如应用程序这样的最小数据库; - )

有人可能会尝试在更健壮的代码中测试显式设置的None变量,尝试在文件不存在时捕获异常,或者不允许读取或不能成功解析。

答案 2 :(得分:0)

更多“初学者友好”的解决方案:

words = open("words.txt",'r').read().split()
order = open("order.txt",'r').read().split()
result = ""
for i in order:
    result+= words[int(i)-1] + " "
print(result)

,结果是一样的:

i am what i am so deal with it 

答案 3 :(得分:0)

您可以使用枚举来获取单词的当前位置,然后创建字典。要阅读文件,您可以使用以下内容:

with open('file1.txt', 'r') as f:
    string = f.read()

with open('file2.txt', 'r') as f:
    order = [int(i) for i in f.read().split()]

然后重新排序:

string = "i am what so deal with it"
order = [1, 2, 3, 1, 2, 4, 5, 6, 7]

string = string.split()

indexDict = {i:j for i,j in enumerate(string)}

newString = ' '.join([indexDict[i-1] for i in order])

输出:

>>> newString
'i am what i am so deal with it'