2015-06-24 3 views
1

Я пытаюсь создать dict из списка заголовков, который «связывает» столбцы данных с тем же экспериментом. Например, я хочу обратиться:Python Добавить ключ к Dict условно

headers = ["A_1","A_2","A_3","B_1","B_2","B_3"] 

в

cols = { 1 : {'A' : 0, 'B' : 3}, 2: {'A' : 1, 'B' : 5} ... } 

Мой код выглядит следующим образом:

cols = {} 
headers = ["A_1","A_2","A_3","B_1","B_2","B_3"] 

col_number = 0 
for header in headers: 
    run_number = header[-1:] 
    cols[ run_number ] = {} 

    if "A_" in header: 
     cols[ run_number ][ 'A' ] = col_number 
    if "B_" in header: 
     cols[ run_number ][ 'B' ] = col_number 

    col_number += 1 
print cols 

Этот вывод только последний "B" колонки:

{'1': {'B':3}, '2':{'B':5}... } 

ОДНАКО, если я попробую простой эксперимент t в командной оболочке, эта нотация, похоже, хорошо работает ...

cols = {} 
cols[1] = {} 
cols[1]['A'] = 1 
cols[1]['B'] = 2 
print cols 

>> {'1' : {'A':1,'B':2} } 

Почему?

EDIT: Просто нужен еще один набор глаз, я думаю. Проблема была эта линия в петле ...

cols[ run_number ] = {} 

Он переписывает COLS [run_number] в пустой Словаре каждый раз, когда колонна из предварительно существующих run_number достигается.

+0

Вы уверены, что последний сегмент работал для вас? Вы назначили ключ '1' со значением пустого' list', но затем вы пытаетесь добавить к этому 'list' со словарной нотацией. Результат также кажется поддельным, поскольку он превратил целочисленный ключ '1' в строку' '1''. – TigerhawkT3

+0

Что значения в dict '{'A': 1, 'B': 5}'? это индексы? если да, то почему не 'B: 4'? – Kasramvd

ответ

1

Ваш цикл перезаписи этой важной переменной и установить его в пустой Dict:

cols[ run_number ] = {} 

Это означает, что он получает через струнам «A_» для различных чисел, а затем, когда он на струнах «B_» , он перезаписывает все ключи run_number, которые уже созданы для строк «A_».

Вы должны попробовать что-то вроде следующего вместо:

if run_number not in cols: 
    cols[ run_number ] = {} 

Кроме того, вы можете попробовать использовать defaultdict

+0

Спасибо. Тупой вопрос в ретроспективе. – user3700949

+0

Я не знаю, согласен ли я. Требуется некоторое время, чтобы создать ментальную модель того, что делает интерпретатор, так что, прочитав некоторый код, вы имеете в виду все значения переменных. Если вы все еще учитесь, что-то вроде этого инструмента может помочь в этом (особенно для рекурсии): http://www.pythontutor.com/ – erewok

1

Вы должны перейти к следующей строке кодов:

if run_number not in cols: 
    cols[ run_number ] = {} 

I испытано, работает следующий код:

for header in headers: 
    run_number = header[-1:] 
    if run_number not in cols: 
     cols[ run_number ] = {} 
    if "A_" in header: 
     cols[ run_number ][ 'A' ] = col_number 
    if "B_" in header: 
     cols[ run_number ][ 'B' ] = col_number 
    col_number += 1 
0

Во-первых, вы можете использовать enumerate(), чтобы Python автоматически отслеживал подсчет. Во-вторых, как говорили другие, вы заменяете свои словарные ключи новым, а не добавляете в существующий словарь.

Нечто подобное должно работать для вашего случая:

cols = {} 
for col, header in enumerate(headers): 
    typ, _, key = header.partition('_') 
    if key not in cols: 
     cols[key] = {} 
    cols[key][typ] = col 

с вашими данными, cols является:

{'1': {'A': 0, 'B': 3}, '2': {'A': 1, 'B': 4}, '3': {'A': 2, 'B': 5}} 
0
  1. Поскольку "run_number" переменная повторяется каждый раз, когда вы цикл и он повторяется, вы перезаписываете его любым пустым dict.

  2. Ниже приведен способ достижения вашей цели.

    def answer(): 
        headers = ["A_1","A_2","A_3","B_1","B_2","B_3"] 
        cols = {} 
        cols[1] = {} 
        cols[2] = {} 
        cols[3] = {} 
        for header in headers: 
         cols[int(header[-1:])][str(header[:-1])] = headers.index(header) 
    
        return cols 
    
    print answer() 
    
Смежные вопросы