Python 如何从字典中创建句子

Python 如何从字典中创建句子,python,string,python-3.x,dictionary,input,Python,String,Python 3.x,Dictionary,Input,我试图制作一些代码,用户输入一个句子,将句子转换成dict,然后使用dict返回原始句子 代码: 输入: Hello my name is Bob 实际产量: {'Hello' : '1', 'name' : '3', 'Bob' : '5', 'my' : '2', 'is' : '4'} Hello name Bob my is 期望输出: {'Hello' : '1', 'name' : '3', 'Bob' : '5', 'my' : '2', 'is' : '4'} Hello m

我试图制作一些代码,用户输入一个句子,将句子转换成dict,然后使用dict返回原始句子

代码:

输入:

Hello my name is Bob
实际产量:

{'Hello' : '1', 'name' : '3', 'Bob' : '5', 'my' : '2', 'is' : '4'}
Hello name Bob my is
期望输出:

{'Hello' : '1', 'name' : '3', 'Bob' : '5', 'my' : '2', 'is' : '4'}
Hello my name is Bob
这也可以:

{'Hello' : '1', 'my' : '2', 'name' : '3', 'is' : '4', 'Bob' : '5'}
Hello my name is Bob

对于我重新创建原始句子的部分,它不能只打印句子,它必须来自于dict。

使用
枚举
上的
有序dict
,如下所示:

from collections import OrderedDict

s = "Hello my name is Bob"

d = OrderedDict((v, i) for i, v in enumerate(s.split(), 1))
print(d)
# OrderedDict([('Hello', 1), ('my', 2), ('name', 3), ('is', 4), ('Bob', 5)])

s_rebuild = ' '.join(d)
print(s_rebuild)
# 'Hello my name is Bob'

由于字典已排序,因此这些值不用于重建字符串。

您需要使用
OrderedDict
保留元素顺序,或者在打印之前对字典元素进行排序。您已经得到了一个
OrderedDict
答案,下面是如何使用您创建的dict:

print(' '.join(k for (k, v) in sort(dictionary.items(), key=lambda x: x[1])))

顺便说一句,你的方法有一个缺陷:如果你把它应用到一个有重复单词的句子中,例如,“boys will be boys”,你会发现字典中没有索引
1
的元素,因为
(boys,4)
将覆盖
(boys,1)

您的逻辑有缺陷,因为它无法处理重复单词的句子:

Hello Bob my name is Bob too
{'name': 4, 'Hello': 1, 'Bob': 6, 'is': 5, 'too': 7, 'my': 3}
name Hello Bob is too my
我们可以使用defaultdict来处理这个问题,使值成为单词位置的数组,而不是单个数字。我们可以通过拆分预先处理您的剩余工作清单来进一步改进。最后,我们可以使用一对嵌套循环来重构原始句子。我们不希望/不需要一个OrderedICT或排序来执行此操作:

import re
import json
from collections import defaultdict

PUNCH_LIST = r"[ {},:'[\]1-5]+"

def code():
    dictionary = defaultdict(list)

    sentence = input("Please write a sentence: ") 

    for position, word in enumerate(re.split(PUNCH_LIST, sentence), start=1):
        dictionary[word].append(position)

    with open('Dict.txt', 'w') as fp:
        json.dump(dictionary, fp)

    print(dictionary) 

    position = 1
    sentence = []

    while position:
        for word, positions in dictionary.items():
            if position in positions:
                sentence.append(word)
                position += 1
                break
        else:
            position = 0

    print(' '.join(sentence))

code()
示例:

Please write a sentence: Hello Bob, my name is Bob too
defaultdict(<class 'list'>, {'is': [5], 'too': [7], 'Bob': [2, 6], 'Hello': [1], 'name': [4], 'my': [3]})
Hello Bob my name is Bob too

请注意,defaultdict是一种方便,而不是一种要求。普通字典也可以,但您必须初始化每个键的列表。

您可以使用OrderedDict
Please write a sentence: Hello Bob, my name is Bob too
defaultdict(<class 'list'>, {'is': [5], 'too': [7], 'Bob': [2, 6], 'Hello': [1], 'name': [4], 'my': [3]})
Hello Bob my name is Bob too
{"is": [5], "too": [7], "Bob": [2, 6], "Hello": [1], "name": [4], "my": [3]}