#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)