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

Я пытаюсь сгенерировать словарь {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]

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

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Эта строка является вашей проблемой:

anaDict[key].append(value)

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

anaDict[key].extend(value)

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

0 голосов
/ 08 апреля 2019

Модифицированный код в соответствии с предложением @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)
...