2014-09-28 1 views
-1

, поэтому я пытался заставить эти две функции работать, когда я их выполняю, они работают, но когда я объединяю две функции, используя функцию elif, она запускает только 1-й функция и выводит список позиций, и ошибка говорит: «neighbour_list не определен»две функции, читающие txt-файл, используя elif

это мой код

my_file=open("test_graph_1.txt","r") 
x=[] 
y=[] 
nodenumber=[] 
positionx=[] 
positiony=[] 


for row in my_file: 

    value=row[:-1] 

    my_list=value.split(",") 

    if len(my_list)==3: 
     nodenumber.append(int(my_list[0])) 

     positionx.append(int(my_list[1])) 
     positiony.append(int(my_list[2])) 

     nodenumber1 =[(nodenumber[a],positionx[a],positiony[a]) for a i range(len(nodenumber))] 
     position_list=tuple(nodenumber1) 




    elif len(my_list)==2: 
     x.append(int(my_list[0])) 
     y.append(int(my_list[1])) 

     l1 = [(x[i] , y[i]) for i in range(len(x))] 
     l2 = [(y[i] , x[i]) for i in range(len(x))] 
     l1.extend(l2) 
     neighbour_list=[[l[0] for l in l1 if l[1] == j] for j in range(len(x))] 


print("position_list",position_list) 
print("neigh",neighbour_list) 

но когда я напечатать код список позиций приходит поместить хорошо, но neighbour_list выходит например: [[4, 1], [0, 4, 2], [1, 3], [2, 5, 4], [3, 0, 1], [3], []] добавочная пустая строка, которая не должна быть там, но до этого все нормально

+0

так где ваши функции? – Kasramvd

+0

жаль, что я havent получил ручку на языке еще, я имею в виду мои 2 разных цикла, чтобы получить position_list и neighbour_list – 13python

+1

'else my_list [2] ==" ":' должен был повысить SyntaxError. Вы имели в виду 'elif ...'? (или просто 'else:'?) – unutbu

ответ

0

Если для каждого прохождения по контуру my_list[2] != "" имеет значение True, то neighbour_list не определяется. Затем

print("neigh",neighbour_list) 

поднимет NameError: the neighbour_list is not defined.


Вместо определения neighbour_list перед входом в for-loop. Вы также можете использовать

if len(my_list) == 3: 
    ... 
elif len(my_list) == 2: 
    ... 
else: 
    ... 

для обработки двух типов линий, которые вы ожидаете получить.


N = 5 
position_list = list() 
neighbour_list = [list() for j in range(N)] 

with open("test_graph_1.txt","r") as my_file: 
    for row in my_file: 
     try: 
      my_list = map(int, row.split(',')) 
     except ValueError: 
      # Choose how to handle malformed lines 
      print('invalid line: {!r}'format(row)) 
      continue 
     if len(my_list) == 3: 
      nodenumber, positionX, positionY = my_list 
      position_list.append(tuple([nodenumber,positionX,positionY])) 
     elif len(my_list) == 2: 
      nodenumber1, nodenumber2 = my_list 
      neighbour_list[nodenumber1].append(nodenumber2) 
      neighbour_list[nodenumber2].append(nodenumber1)    
     else: 
      # Choose how to handle lines with more than 3 or less than 2 items 
      continue 

print(position_list) 
print("neigh", neighbour_list) 

Вы также можете использовать библиотеку графа, как networkx или igraph.

+0

Да, это то, что случилось, как бы я решил это? – 13python

+0

Вы должны присвоить значение классу neighbour_list. Вы не сказали, что должна делать ваша программа, поэтому мы не можем с этим справиться. –

+0

Вы можете определить значение для 'neighbour_list' около вершины, перед' for-loop'. Вы можете установить его в пустой список или «Нет», в зависимости от того, что вы хотите, чтобы программа выполняла, когда «elif-suite» никогда не был достигнут. – unutbu