我正在创建一个代码,我需要使用一串单词,将其转换为hi bye hi hello
将转换为0 1 0 2
的数字。我用字典来做这个,这就是我在下一部分遇到麻烦的原因。然后,我需要将其压缩为一个文本文件,然后再解压缩并重新构建为一个字符串。这是我难倒的。
我想这样做的方法是压缩数字的索引,所以0 1 0 2
位进入带有字典内容的文本文件,所以在文本文件中它会有0 1 0 2
和{hi:0, bye:1, hello:3}
。
现在我想做什么来解压缩或读取到python文件中,使用索引(这是我将从现在开始引用0 1 0 2
的方式)到然后从字典中取出每个单词并重新构造句子,所以如果 0 出现,它会查看字典,然后查找具有0
定义的内容,然后将其拉出来要放入字符串,所以它会找到hi
并接受它。
我希望这是可以理解的,并且至少有一个人知道该怎么做,因为我确信这是可能的,但是我无法在这里或在互联网上找到任何提及此主题的内容。
答案 0 :(得分:0)
是的,您可以使用常规的词典和列表来存储数据。并使用json
或pickle
将数据保存到磁盘。
import pickle
s = 'hi hello hi bye'
words = s.split()
d = {}
for word in word:
if word not in d:
d[word] = len(d)
data = [d[word] for word in words]
with open('/path/to/file', 'w') as f:
pickle.dump({'lookup': d, 'data': data}, f)
然后在
中阅读with open('/path/to/file', 'r') as f:
dic = pickle.load(f)
d = d['lookup']
reverse_d = {v: k for k, v in d.iteritems()}
data = d['data']
words = [reverse_d[index] for index in data]
line = ' '.join(words)
print line
答案 1 :(得分:0)
因为我并不确切知道你如何创建你的密钥图,所以我能做的最好的就是猜测。在这里,我创建了两个函数,可用于根据键映射将字符串写入txt文件,并读取txt文件并返回基于键映射的字符串。我希望这对您有用,或者至少让您对该过程有充分的了解!祝你好运!
import os
def pack(out_file, string, conversion_map):
out_string = ''
for word in string.split(' '):
for key,value in conversion_map.iteritems():
if word.lower() == value.lower():
out_string += str(key)+' '
break
else:
out_string += word+' '
with open(out_file, 'wb') as file:
file.write(out_string)
return out_string.rstrip()
def unpack(in_file, conversion_map, on_lookup_error=None):
if not os.path.exists(in_file):
return
in_file = ''.join(open(in_file, 'rb').readlines())
out_string = ''
for word in in_file.split(' '):
for key, value in conversion_map.iteritems():
if word.lower() == str(key).lower():
out_string += str(value)+' '
break
else:
if on_lookup_error:
on_lookup_error()
else:
out_string += str(word)+' '
return out_string.rstrip()
def fail_on_lookup():
print 'We failed to find all words in our key map.'
raise Exception
string = 'Hello, my first name is thelazyscripter'
word_to_int_map = {0:'first',
1:'name',
2:'is',
3:'TheLazyScripter',
4:'my'}
d = pack('data', string, word_to_int_map) #pack and write the data based on the conversion map
print d #the data that was written to the file
print unpack('data', word_to_int_map) #here we unpack the data from the file
print unpack('data', word_to_int_map, fail_on_lookup)
答案 2 :(得分:0)
TheLazyScripter为这个问题提供了一个很好的解决方案,但是运行时特性并不好,因为对于每个重构的单词,你必须遍历整个dict。
我会说你选择了错误的字典设计:为了提高效率,应该一步完成查找,因此你应该将数字作为键,将单词作为项目。
由于您的问题看起来像是一个伟大的计算机科学作业(我会考虑我的学生;-)),我只是给你一个解决方案草图:
word in my_dict.values() #(adapt for py2/py3)
来测试单词是否已经在字典中。 insert the next available index
为关键字,而单词为值。 print(my_dict[key])
此解决方案比您的方法更有效(并且更容易实现)。