我正在研究一些這樣的句子:
sentence = "PERSON is ADJECTIVE"
dictionary = {"PERSON": ["Alice", "Bob", "Carol"], "ADJECTIVE": ["cute", "intelligent"]}
我現在需要所有可能的組合來從字典中形成這個句子,例如:
Alice is cute
Alice is intelligent
Bob is cute
Bob is intelligent
Carol is cute
Carol is intelligent
上面的用例比較簡單,用下面的代碼就完成了
dictionary = {"PERSON": ["Alice", "Bob", "Carol"], "ADJECTIVE": ["cute", "intelligent"]}
for i in dictionary["PERSON"]:
for j in dictionary["ADJECTIVE"]:
print(f"{i} is {j}")
但是我們也可以將這個擴展到更長的句子嗎?
例子:
sentence = "PERSON is ADJECTIVE and is from COUNTRY"
dictionary = {"PERSON": ["Alice", "Bob", "Carol"], "ADJECTIVE": ["cute", "intelligent"], "COUNTRY": ["USA", "Japan", "China", "India"]}
這應該再次提供所有可能的組合,例如:
Alice is cute and is from USA
Alice is intelligent and is from USA
.
.
.
.
Carol is intelligent and is from India
我嘗試使用https://www.pythonpool.com/python-permutations/,但句子都混淆了 - 但是我們如何修復幾個單詞,就像在這個例子中單詞"and is from"是固定的
本質上,如果字典中的任何鍵等于字串中的單詞,則該單詞應替換為字典中的值串列。
任何想法都會非常有幫助。
uj5u.com熱心網友回復:
我的答案基于兩個構建塊itertools.product和zip.
itertools.product 將允許我們獲得字典串列值的各種組合
zip使用原始鍵和上面的組合將允許我們創建一個可以使用的元組串列replace。
import itertools
sentence = "PERSON is ADJECTIVE and is from COUNTRY"
dictionary = {"PERSON": ["Alice", "Bob", "Carol"], "ADJECTIVE": ["cute", "intelligent"], "COUNTRY": ["USA", "Japan", "China", "India"]}
keys = dictionary.keys()
for values in itertools.product(*dictionary.values()):
new_sentence = sentence
for tpl in zip(keys, values):
new_sentence = new_sentence.replace(*tpl)
print(new_sentence)
如果你碰巧有能力控制“句子”模板,你可以這樣做:
sentence = "{PERSON} is {ADJECTIVE} and is from {COUNTRY}"
然后您可以將其簡化為:
sentence = "{PERSON} is {ADJECTIVE} and is from {COUNTRY}"
dictionary = {"PERSON": ["Alice", "Bob", "Carol"], "ADJECTIVE": ["cute", "intelligent"], "COUNTRY": ["USA", "Japan", "China", "India"]}
keys = dictionary.keys()
for values in itertools.product(*dictionary.values()):
new_sentence = sentence.format(**dict(zip(keys, values)))
print(new_sentence)
兩者都應該給你這樣的結果:
Alice is cute and is from USA
Alice is cute and is from Japan
...
Carol is intelligent and is from China
Carol is intelligent and is from India
請注意,模板中的出現順序并不重要,兩種解決方案都應使用以下模板:
sentence = "PERSON is from COUNTRY and is ADJECTIVE"
或在情況 2
sentence = "{PERSON} is from {COUNTRY} and is {ADJECTIVE}"
uj5u.com熱心網友回復:
您可以先將字典鍵替換為sentenceto,{}以便您可以輕松地在回圈中格式化字串。然后您可以使用itertools.product來創建 的笛卡爾積dictionary.values(),因此您可以簡單地回圈它以創建您想要的句子。
from itertools import product
sentence = ' '.join([('{}' if w in dictionary else w) for w in sentence.split()])
mapped_sentences_generator = (sentence.format(*tple) for tple in product(*dictionary.values()))
for s in mapped_sentences_generator:
print(s)
輸出:
Alice is cute and is from USA
Alice is cute and is from Japan
Alice is cute and is from China
Alice is cute and is from India
Alice is intelligent and is from USA
Alice is intelligent and is from Japan
Alice is intelligent and is from China
Alice is intelligent and is from India
Bob is cute and is from USA
Bob is cute and is from Japan
Bob is cute and is from China
Bob is cute and is from India
Bob is intelligent and is from USA
Bob is intelligent and is from Japan
Bob is intelligent and is from China
Bob is intelligent and is from India
Carol is cute and is from USA
Carol is cute and is from Japan
Carol is cute and is from China
Carol is cute and is from India
Carol is intelligent and is from USA
Carol is intelligent and is from Japan
Carol is intelligent and is from China
Carol is intelligent and is from India
請注意,這適用于 Python > 3.6,因為它假定保持字典插入順序。對于較舊的 Python,必須使用collections.OrderedDict而不是dict.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/382241.html
標籤:Python 蟒蛇-3.x 列表 python-2.7 无印良品
上一篇:為什么串列的排序在Python的列印函式之外作業,而不是在列印函式內作業?[復制]
下一篇:在一行中形成兩個文本欄位
