Как я могу добавить список значений для одного словарного ключа (1_key: [N_values]) в Python?

#python-3.x #dictionary #multi-value-dictionary

#python-3.x #словарь #многозначный словарь

Вопрос:

Я пытаюсь сгенерировать словарь {single-key: [multi-value]} в Python из файла .txt.

Это текстовый файл (разделенный табуляцией),

 A02.835.583.748      A02.880     0.818181818181818
A02.835.583.748      A02.513     0.818181818181818
A02.835.583.748      A01.378.800.750     0.636363636363636
A02.835.583      A02.880     0.863636363636364
A02.835.583      A02.513     0.863636363636364
A02.835.583      A01.378.800.750     0.681818181818182
A01.378.800.750      A02.880     0.727272727272727
A01.378.800.750      A02.513     0.727272727272727
A01.378.800.750      A01.378.800.750     1
  

Для того же я использую функцию «defaultdict()», но почему-то я не могу правильно сгенерировать словарь. Я могу сгенерировать словарь с помощью этого, но это странно. Итак, я извлекаю один из ключей из этого странного словаря.

 print(anaDict.get('A02.835.583.748'))
  

Вывод:

 ['A02.880=0.818181818181818', [...], ['A02.513=0.818181818181818'], ['A01.378.800.750=0.636363636363636']]
  

Однако […] в этом словаре фактически вложены другие значения того же ключа в виде начального значения.

Код, который я пишу,

 anaDict = defaultdict()
anaSet = set()
with open(f, 'r') as anaFile:
    if '148' in f:
        for line in anaFile:
            key = line.split('t')[0].rstrip()
            conclusionVal = line.split('t')[1].strip()
            simScore = line.split('t')[2].strip()
            value = [conclusionVal   "="   simScore]
            if key not in anaDict:
                print("Here it goes: " , key, value)
                anaDict[key] = value                    
            if key in anaDict:
                print("Different value: ", key, value)
                anaDict[key].append(value)

        print(anaDict.get('A02.835.583.748'))
  

Я ожидал, что код сгенерирует следующий словарь (показанный в виде пар ключ-значение).

 A02.835.583.748 : [A02.880 = 0.818181818181818 , A02.513 = 0.818181818181818,  A01.378.800.750 = 0.636363636363636]
A02.835.583 : [A02.880 = 0.863636363636364, A02.513 = 0.863636363636364, A01.378.800.750 = 0.681818181818182]
A01.378.800.750 : [A02.880 = 0.727272727272727, A02.513  = 0.727272727272727, A01.378.800.750 = 1]
  

Я не могу понять, что я делаю неправильно. Я буду полезен за любую помощь или направление.

Ответ №1:

Эта строка здесь — ваша проблема:

 anaDict[key].append(value)
  

При использовании list#append вы помещаете аргумент целиком в список. Но поскольку вы передаете список, вы помещаете список в список. То, что вы описали, что хотите сделать, это добавить все значения из списка аргументов, а не сам список. Все, что вам нужно сделать, это заменить append на extend .

 anaDict[key].extend(value)
  

Затем вы говорите интерпретатору распаковать список аргументов и добавить каждое из значений.

Ответ №2:

Модифицированный код в соответствии с предложением от @mypetlion (который работает) обновляется в разделе.

 anaDict = defaultdict()
anaSet = set()
#print(f)
with open(f, 'r') as anaFile:
    if '148' in f:
        for line in anaFile:
            key = line.split('t')[0].rstrip()
            conclusionVal = line.split('t')[1].strip()
            simScore = line.split('t')[2].strip()
            value = [conclusionVal   "="   simScore]
            if key not in anaDict:
                anaDict[key] = value
            if key in anaDict:
                anaDict[key].extend(value)