加入字典术语以形成字符串

时间:2013-12-07 02:02:47

标签: python string dictionary

所以,我有一个术语词典,其中每个键都是文本文件中的一个词,该值是该文本文件中接下来两个词的列表。

def dict(txt, n):
    txt = txt.split()
    output = {}
    for i in range(len(txt)-n+1):
        t = ' '.join(txt[i:i+1])
        p = text[i+1:i+n]
        output.setdefault(t, 0)
        output[t] = p
    return output

输出是一个字典:

{'had':['a','little'], 'Mary':['had','a'], 'a': ['little', 'lamb.']} 

(我的实际上要长得多,因为它正在分析一篇长篇论文。)

我的问题是,如何通过读取密钥,然后打印值,然后读取最后一个值,然后找到与该值匹配的密钥,将这些术语重新连接在一起。目标是最终获得一个随机段落,使用大型文档提供。

到目前为止,我有以下几点:

if output[t] == text[1]:
    return output
    print(output.join(' ')

但这并不能归还任何东西。建议?

3 个答案:

答案 0 :(得分:0)

Python' join可能不像您期望的那样工作。

你在想你写的

collection.join(join_character)

但它是

join_character.join(collection)

您应该期望编写像

这样的代码
' '.join(output)

output你究竟需要什么取决于你;我希望你能把这部分搞清楚。看起来您在这里错误地使用了join

答案 1 :(得分:0)

这将添加条款,直到dic不包含key

dic = {'had': ['a', 'little'], 'Mary': ['had', 'a'], 'a': ['little', 'lamb.']}
key = 'Mary'
res = []

while True:
    try:
        res.extend(dic[key])
        key = dic[key][-1]
    except KeyError:
        break

print ' '.join(res)

这会产生:

['had', 'a', 'little', 'lamb.']

请注意:如果所有值也是键,您将进入无限循环。如果字典中有重复序列,您也会遇到此问题,例如

{'a': ['b', 'c'], 'b': ['a', 'c'], 'c': ['a', 'b'], 'foo': ['bar', 'foobar']}

为了避免这种情况,你可以做两件事中的一件:

  1. 设置最大迭代值
  2. 遇到以前见过的密钥时停止迭代。
  3. 最大迭代次数值

    dic = {'had': ['a', 'little'], 'Mary': ['had', 'a'], 'a': ['little', 'lamb.']}
    key = 'Mary'
    res = []
    max_iterations = 10
    i = 0
    
    while i < max_iterations
        try:
            res.extend(dic[key])
            key = dic[key][-1]
        except KeyError:
            break
        i += 1
        if i > max_iterations:
            break
    print ' '.join(res)
    

    停在先前看到的密钥

    dic = {'had': ['a', 'little'], 'Mary': ['had', 'a'], 'a': ['little', 'lamb.']}
    key = 'Mary'
    res = []
    seen_keys = []
    
    while True:
        if key in seen_keys:
            break
        try:
            res.extend(dic[key])
            seen_keys.append(key)
            key = dic[key][-1]
        except KeyError:
            break
    
    print ' '.join(res)
    

答案 2 :(得分:0)

您的数据结构dict['word1'] = ('word2', 'word3')要求您搜索数据值,效率非常低。

如果将其组织为dict[('word1', 'word2')] = ['possible', 'word3', 'values'],将会更容易查找。

from itertools import tee, izip
from collections import defaultdict
from random import choice

def triwise(iterable):
    a,b,c = tee(iter(iterable), 3)
    next(b, None)
    next(c, None)
    next(c, None)
    return izip(a, b, c)

def make_lookup(txt):
    res = defaultdict(list)
    words = ['', ''] + txt.strip().split() + ['', '']
    for w1, w2, w3 in triwise(words):
        res[(w1, w2)].append(w3)
    return dict(res)

def make_sentence(lookup):
    w1, w2 = '', ''
    words = []
    while True:
        w1, w2 = w2, choice(lookup[(w1, w2)])
        if w2 == '':
            return ' '.join(words)
        else:
            words.append(w2)

def main():
    txt = 'Mary had a little lamb whose fleece was white as snow'
    lookup = make_lookup(txt)
    print(make_sentence(lookup))

if __name__=="__main__":
    main()