我在处理一个谜题:
给定一个以元组作为键的字典: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不重复和最终选择函数在组合生成期间。我只是在如何实际执行此操作方面遇到了困难。
谢谢阅读! Sara
编辑:
澄清一下,我编写了一个替代代码,将最终函数(基本上是均方根)与一对集合结合使用。
`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
是较小生成列表的长度? - Jared Goguen