Я пытаюсь создать словарь {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]
Не могу понять, что я делаю не так. Я буду полезен для любой помощи или направления.
Вот эта строка и есть ваша проблема:
anaDict[key].append(value)
Когда вы используете list#append
, вы полностью помещаете аргумент в список. Но поскольку вы передаете список, вы помещаете список в список. То, что вы описали, хотите сделать, это добавить все значения из списка аргументов, а не из самого списка. Все, что вам нужно сделать, это заменить append
на extend
.
anaDict[key].extend(value)
Затем вы говорите интерпретатору распаковать список аргументов и добавить каждое из значений.
Модифицированный код по предложению @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)