更改元组列表中的值

时间:2017-01-22 15:46:13

标签: python list graph

我制作了一个代表图表的元组列表,(u,v,w)是表示uv之间边缘的元组,其权重值为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)]

我希望能够更改特定边缘的权重,即uv。例如,将边缘('A','B')的权重从2.0更改为10.因此,我尝试使用枚举如下:

[i for i, v in enumerate(graph) if v[0] & v[1] == ('A','B')]

这个不起作用。此外,我不确定使用枚举是否是最简单的方法。我可以有一些想法如何改善这条线?谢谢

3 个答案:

答案 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)

每当图形边缘(而不是权重)发生变化时,您都需要构建一个新的字典。