回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我在做一个谜语:</p>
<p>给定一个包含关键字元组的字典:<code>dictionary = {(p,q):n}</code>,我需要生成每个组合的新字典的列表,这样在新字典中p和q都不会重复。在生成此字典列表期间或之后,根据使用字典值的计算,从中选择一个字典作为所需的字典。在</p>
<p>我的意思是(但要小得多):</p>
<p><code>dictionary = {(1,1): 1.0, (1,2): 2.0, (1,3): 2.5, (1,4): 5.0, (2,1): 3.5, (2,2): 6.0, (2,3): 4.0, (2,4): 1.0}</code></p>
<p>变成</p>
<p><code>listofdictionaries = [{(1,1): 1.0, (2,2): 6.0}, {(1,1): 1.0, (2,3): 4.0}, (1,1): 1.0, (2,4): 1.0}, {(1,2): 2.0, (2,1): 3.5}, {(1,2): 2.0, (2,3): 4.0},</code>等</p>
<p>像:<code>{(1,1): 1.0, (2,1): 3.5}</code>这样的字典是不允许的,因为q重复。在</p>
<p>现在我的可悲故事:我是全新的编码。。。我试图分析我的一些数据。但我也认为这是一个有趣的算法之谜。我写的东西可以用很小的字典,但当我输入一个大的字典时,运行(下面复制)的时间太长了。在我的脚本尝试中,我实际上生成了一个元组组合的列表,我在以后的脚本中使用这些组合来引用我的主字典。我把它复制到下面:</p>
<p><em>字典元组键由两个列表生成:“ExpList1”和“ExpList2”</em></p>
<pre><code>#first, I generate all the tuple combinations from my ExpDict dictionary
combos =(itertools.combinations(ExpDict,min(len(ExpList1),len(ExpList2))))
#then I generate a list of only the combinations that don't repeat p or q
uniquecombolist = []
for foo in combos:
counter = 0
listofp = []
listofq = []
for bar in foo:
if bar[0] in listofp or bar[1] in listofq:
counter=+1
break
else:
listofp.<a href="https://www.cnpython.com/list/append" class="inner-link">append</a>(bar[0])
listofq.append(bar[1])
if counter == 0:
uniquecombolist.append(foo)
</code></pre>
<p>在生成这个列表之后,我将一个函数应用于所有字典组合(遍历元组列表并从主字典调用它们各自的值),并从该函数中选择结果值最小的组合。在</p>
<p>我还尝试在迭代组合时应用这个函数,选择唯一的p,q,然后检查结果值是否小于前一个值,如果小于则保留(这不是生成列表“uniquecombolist”,我最终只生成最终的元组列表),仍然需要太长时间。在</p>
<p>我认为解决方法在于在组合生成过程中嵌入p,q-无重复和最终选择函数。我只是不知道该怎么做。在</p>
<p>谢谢你的阅读!
萨拉</p>
<p>编辑:</p>
<p>为了澄清这一点,我编写了一个替代代码,它将最终函数(基本上是均方根)合并到对集合中。在</p>
^{pr2}$
<p>因此,如果我能在集合生成过程中合并RMS计算,只保留最小的一个,我想这将解决我的组合问题。在</p>