2016-12-31 3 views
1

Я пытаюсь заполнить словарь, используя петлю, проблема заключается цикл останавливается после выполнения условия, не проверяя, есть ли более доступные условия выполнения, вPython для итерации цикла

sec=[ 
    [1, 2, 4.0, 100.0], 
    [2, 3, 1.5, 500.0], 
    [2, 4, 10.0, 700.0], 
    [2, 5, 5.75, 1500.0], 
    [3, 4, 11.4, 200.0], 
    [4, 5, 10.5, 750.0], 
    [4, 6, 6.75, 550.0]] 

Я сделал этот список и есть также этот словарь

graph={1: [1], 2: [2], 3: [3], 4: [4], 5: [5], 6: [6]} , что я пытаюсь сделать это

graph = {1: ['2'], 
     2: ['3', '4','5'], 
     3: ['4'], 
     4: ['5','6'], 
     5: [], 
     6: []} 

как он должен приста k состоит в том, что он собирает все sec[x][0] в качестве ключа словаря и sec[n][1] как значения в словарях , если sec [x] [0] имеет значение 1 и sec [x] [1] имеет значение 2, тогда число 2 равно добавляется в словарь в качестве значения для ключа 1 код, который я получил это

def magic(numList): #turns string into int 
    s = ''.join(map(str, numList)) 
    return int(s) 
for i in range(1,len(loc)+1): #len of loc is 6 
    for n in range(0,len(loc)+1): 
     if magic(graph[i])==sec[n][0]: 
      graph[i].append(sec[n][1]) 

, но это будет только добавить первое значение, то индекс п остановит отсчет, а затем индекс я продолжает идти и поэтому он не будет проверять больше значений в ключах

+1

Трудно сказать, почему код не работает, не зная, что точно названный 'функция magic' делает. Кроме того, должны ли они быть списками строк? –

+0

извините забыл упомянуть, что, Защиту магии (numList): #turns строка в .join ИНТ S = '' (показать на карте (улица, numList)) возвращение Int (s) в основном превращает строку в целочисленное значение – Enigma

ответ

4

Ваше первоначальное определение graph не подходит для предполагаемого результата. Инициализируйте значения пустыми списками, затем добавьте их в простой цикл:

>>> sec=[ 
    [1, 2, 4.0, 100.0], 
    [2, 3, 1.5, 500.0], 
    [2, 4, 10.0, 700.0], 
    [2, 5, 5.75, 1500.0], 
    [3, 4, 11.4, 200.0], 
    [4, 5, 10.5, 750.0], 
    [4, 6, 6.75, 550.0]] 
>>> graph = {i:[] for i in range(1,7)} 
>>> for x,y,*z in sec: graph[x].append(str(y)) 

>>> graph 
{1: ['2'], 2: ['3', '4', '5'], 3: ['4'], 4: ['5', '6'], 5: [], 6: []} 
+0

Возможно, стоит упомянуть 'defaultdict (list)' – roganjosh

+0

@roganjosh Возможно, но тогда у вас не будет этих '[]'. –

+0

Примечание: '* z' работает только в Python 3.x; для более старых версий используйте 'for x, y, _, _' –

0

Используйте defaultdict из модуля коллекций. Смотрите ниже:

from collections import defaultdict 

graph_dd = defaultdict(list) 

for s in sec: 
    from_, to_ = s[:2] 
    graph_dd[from_].append(to_) 
    # do-nothing reference to to_ creates empty list, so that all nodes are represented 
    # in graph_dd; else 5 and 6 would not be created 
    graph_dd[to_] 

# convert to regular dict (not really necessary, but OP wanted a dict) 
graph = dict(graph_dd.items()) 

for k,v in graph.items(): 
    print(k,':', v) 

печатает:

1 : [2] 
2 : [3, 4, 5] 
3 : [4] 
4 : [5, 6] 
5 : [] 
6 : [] 
Смежные вопросы