我制作了一个代表图表的元组列表,(u,v,w)
是表示u
和v
之间边缘的元组,其权重值为w
:
graph = [('A', 'B', 2.0), ('B', 'C', 1.5), ('A', 'D', 3.0), ('D', 'E', 5.0), ('E', 'F', 2.0), ('B', 'E', 4.0)]
我希望能够更改特定边缘的权重,即u
和v
。例如,将边缘('A','B')
的权重从2.0更改为10.因此,我尝试使用枚举如下:
[i for i, v in enumerate(graph) if v[0] & v[1] == ('A','B')]
这个不起作用。此外,我不确定使用枚举是否是最简单的方法。我可以有一些想法如何改善这条线?谢谢
答案 0 :(得分:3)
元组不可变所以你不能改变它,你可以获得索引:
[i for i, v in enumerate(graph) if v[:2] == ('A','B')] #list of indices ('A','B',?)
现在,您可以使用以下程序设置('A','B',?)
的元组:
for i,v in enumerate(graph):
if v[:2] == ('A','B'):
graph[i] = ('A','B',10.0)
在Python交互式shell中运行它会给出:
$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> graph = [('A', 'B', 2.0), ('B', 'C', 1.5), ('A', 'D', 3.0), ('D', 'E', 5.0), ('E', 'F', 2.0), ('B', 'E', 4.0)]
>>> for i,v in enumerate(graph):
... if v[:2] == ('A','B'):
... graph[i] = ('A','B',10.0)
...
>>> graph
[('A', 'B', 10.0), ('B', 'C', 1.5), ('A', 'D', 3.0), ('D', 'E', 5.0), ('E', 'F', 2.0), ('B', 'E', 4.0)]
立即构建新列表:
[(v[0],v[1],10.0) if v[:2] == ('A','B') else v for v in graph] #construct a new list
答案 1 :(得分:0)
元组是不可变的;但是,您可以使用您想要的值替换 new 元组。
答案 2 :(得分:0)
如果您的图表没有经常更改并且您经常更改边缘权重,则可以运行一次图表并创建索引字典
indices = {(u,v):i for i, (u,v,w) in graph}
并像这样使用
i = indices[('A','B')]
graph[i] = ('A', 'B', 4)
每当图形边缘(而不是权重)发生变化时,您都需要构建一个新的字典。