2017-01-22 2 views
0

Я сделал список кортежей, который представляет собой график такой, что (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)] 

I хотите иметь возможность изменять вес конкретного края, то есть u и v. Так, например, изменение веса края ('A','B') от 2,0 до 10. Таким образом, я попытался с помощью перечисления, как следующее:

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

Этот не работает. Кроме того, я не уверен, что использование перечисления является самым простым способом здесь. Могу ли я получить некоторые идеи по улучшению этой линии? Спасибо

+1

Вы злоупотребляете '&' в своем состоянии. Я подозреваю, что вы хотите '(v [0], v [1]) == ('A', 'B')'. – chepner

ответ

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 дает:

$ 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 
+0

Большое спасибо .. Хорошо объяснили –

0

Корреспонденты неизменяемы; вы можете заменить его нумером нумером со значениями, которые вы хотите.

0

Если ваш график не часто менять, и вы часто вносить изменения в краевые веса, вы можете запустить через граф раз и создать словарь индексов

indices = {(u,v):i for i, (u,v,w) in graph} 

И использовать его как этот

i = indices[('A','B')] 
graph[i] = ('A', 'B', 4) 

Каждый раз, когда ребер графа (а не веса), вам потребуется построить новый словарь.

Смежные вопросы