字典中的排列

时间:2014-12-14 17:42:06

标签: python algorithm recursion

我正在尝试计算不同地点之间的距离并找到最小距离。我想把它作为一种排列,但我很难找到这些排列。

为什么这样做你可能会问?实际上,这只是我正在研究的大型项目的一部分,我实际上必须制作一个汉密尔顿图,但我已经读过,找到排列是获得它的唯一方法。我将修改我的排列查找代码,将其与生成树的长度进行比较(当然,生成树来自相同的节点)。

可能有一件事,为什么我遇到这个问题是我已经尝试解决它好几天了,我终于设法创建了一棵生成树,而且我专注于改变那棵树,我只是想有人来以新的头脑看一看。

I'll start with adding elements into dictionary. Name is the city and the value is the lenght between them.
testDict = {}
testDict['Valga'] = {'Valga':0,'Tõrva': 30, 'Elva':60,'Tartu':80}
testDict['Tõrva'] = {'Tõrva':0,'Valga': 30, 'Elva':40,'Tartu':60}
testDict['Elva'] = {'Elva':0,'Valga': 60, 'Tõrva':40,'Tartu':20}
testDict['Tartu'] = {'Tartu':0,'Valga':80,'Elva':20,'Tõrva':60}

所以我们假设我们从爱沙尼亚的小城市Valga开始。我们可以从那里搬到Tõrva,Elva和Tartu。如果我们搬到Tõrva,我们还有两个选择 - 搬到Elva或Tartu。假设我们选择搬到Elva。现在我们只有一个选择,我们去塔尔图。我们旅行的长度是30 + 40 + 20 = 90.现在,我认为递归将是这里的最佳选择,程序返回Elva,我们从那里搬到塔尔图,也没有更多的城市可以参观,现在我们回到Tõrva。在这里我们选择移动Elva,现在我们搬到塔尔图,从那里只剩下一次访问,它是Elva,现在行程将是:30 + 60 + 20 = 110。

所以我们的第一次旅行是:Valga-Tõrva-Elva-Tartu = 90,我们的第二次旅行是:Valga-Tõrva-Tartu-Elva是110.

现在递归实际上又回到了Valga,因为没有更多的城市可以从Tõrva访问。从Valga我们现在可以访问Elva和Tartu然后继续前进..我知道这可以看作是一棵树。

我有想法以递归方式执行此操作,使用visited作为数组来保存元素。例如,如果我们从Valga开始,Valga会在被访问时被选中,之后我们将它从Tõrva进行比较时,它将不再被看到。

我尝试了不同的方法,但我现在已经多次陷入困境,如果有人能给我很好的指示,我真的很感激。

感谢您的考虑。

1 个答案:

答案 0 :(得分:0)

from itertools import combinations
for i in combinations(range(1,50), 6):
    print (i)
  

for i in permutations(range(1,50),6):
    print (i)

选择你需要的那个,组合用于非重复。

示例:

testDict= {'Valga':0,'Tõrva': 30, 'Elva':60,'Tartu':80}
list1=[]
for i in combinations(testDict.items(),3):
    for x in i:
        if "Valga" in x: #Because we want combinations which is Valga:0
            list1.append(i)
for i in list1:
print(i)

输出:

>>> 
(('Valga', 0), ('Tõrva', 30), ('Tartu', 80))
(('Valga', 0), ('Tõrva', 30), ('Elva', 60))
(('Valga', 0), ('Tartu', 80), ('Elva', 60))
>>> 

Dicts元素是混合的,而不是有序的。所以我把它们放在你能看到的有序列表中。

  

如果您想要排列,请将组合更改为排列。使用排列设置输出:

>>> 
(('Elva', 60), ('Tartu', 80), ('Valga', 0))
(('Elva', 60), ('Tõrva', 30), ('Valga', 0))
(('Elva', 60), ('Valga', 0), ('Tartu', 80))
(('Elva', 60), ('Valga', 0), ('Tõrva', 30))
(('Tartu', 80), ('Elva', 60), ('Valga', 0))
(('Tartu', 80), ('Tõrva', 30), ('Valga', 0))
(('Tartu', 80), ('Valga', 0), ('Elva', 60))
(('Tartu', 80), ('Valga', 0), ('Tõrva', 30))
(('Tõrva', 30), ('Elva', 60), ('Valga', 0))
(('Tõrva', 30), ('Tartu', 80), ('Valga', 0))
(('Tõrva', 30), ('Valga', 0), ('Elva', 60))
(('Tõrva', 30), ('Valga', 0), ('Tartu', 80))
(('Valga', 0), ('Elva', 60), ('Tartu', 80))
(('Valga', 0), ('Elva', 60), ('Tõrva', 30))
(('Valga', 0), ('Tartu', 80), ('Elva', 60))
(('Valga', 0), ('Tartu', 80), ('Tõrva', 30))
(('Valga', 0), ('Tõrva', 30), ('Elva', 60))
(('Valga', 0), ('Tõrva', 30), ('Tartu', 80))
>>>