【发布时间】:2018-03-15 07:56:04
【问题描述】:
我正在研究一个谜题:
给定一个包含键元组的字典:dictionary = {(p,q):n},我需要生成每个组合的新字典列表,这样 p 和 q 都不会在新字典中重复。在生成此字典列表期间或之后,根据使用字典值的计算选择其中一个字典作为所需的字典。
我的意思的例子(但小得多):
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}
变成
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}, 等
不允许使用像 {(1,1): 1.0, (2,1): 3.5} 这样的字典,因为 q 重复。
现在我的故事是:我是编码新手……但我一直在尝试编写这个脚本来分析我的一些数据。但我也认为这是一个有趣的算法谜题。我写了一些适用于非常小的字典的东西,但是当我输入一个大字典时,运行时间太长(复制如下)。在我的脚本尝试中,我实际上生成了一个元组组合列表,而不是稍后在脚本中用于引用我的主字典。下面我复制一下:
字典元组键是使用两个列表生成的:“ExpList1”和“ExpList2”
#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.append(bar[0])
listofq.append(bar[1])
if counter == 0:
uniquecombolist.append(foo)
生成此列表后,我将一个函数应用于所有字典组合(遍历元组列表并从主字典中调用它们各自的值)并从该函数中选择具有最小结果值的组合。
我还尝试应用该函数,同时通过选择唯一 p、q 的组合进行迭代,然后检查结果值是否小于前一个值,如果是则保留它(这不是生成该列表“uniquecombolist ",我最终只生成了最终的元组列表) - 仍然需要很长时间。
我认为解决方案在于在生成组合时嵌入 p,q-no-repeat 和最终选择函数。我只是在思考如何真正做到这一点时遇到了麻烦。
感谢阅读! 萨拉
编辑:
为了澄清,我为我的代码编写了一个替代方案,它将最终函数(基本上是均方根)合并到对集合中。
`combos =(itertools.combinations(ExpDict,min(len(ExpList1),len(ExpList2))))
prevRMSD = float('inf')
for foo in combos:
counter = 0
distanceSUM = 0
listofp = []
listofq = []
for bar in foo:
if bar[0] in listofp or bar[1] in listofq:
counter=+1
break
else:
listofp.append(bar[0])
listofq.append(bar[1])
distanceSUM = distanceSUM + RMSDdict[bar]
RMSD = math.sqrt (distanceSUM**2/len(foo))
if counter == 0 and RMSD< prevRMSD:
chosencombo = foo
prevRMSD = RMSD`
因此,如果我可以在集合生成期间合并 RMS 计算并只保留最小的那个,我认为这将解决我的组合问题。
【问题讨论】:
-
您想生成满足您条件的所有可能的配对集吗?或者
n是较小生成列表长度的可能大小n对组? -
@JaredGoguen 每对都是集合中的一个条目。该集合中有 n 个对,因为 p 和 q 不能重复,所以它必须限制在较小的生成列表的大小。我想生成每个可能的集合,给定两个元组对列表(或两个带有元组键的字典)。
-
我尝试查看 itertools.combinations 的代码,但老实说,我无法充分理解它在我自己的组合条件下工作,甚至是我需要应用的最终功能。我查看了stackoverflow.com/questions/24907913/…,但不幸的是仍然不明白它是如何工作的。就像我在帖子中所说的那样,我对此很陌生(我已经编写了另一个脚本并且从未参加过任何计算机科学课程)所以也许我咬得比我能咀嚼的更多。
标签: python python-2.7 python-3.x combinations itertools