Создайте вложенный словарь из текстового файла с помощью Python 3

Это мой файл: test.txt

Amy|Female|Desc1|12
John|Male|Desc2|10
Mike|Male|Desc3|18

Я попытался создать вложенный словарь, и это не удалось.

Это результат:

{'Amy': '12', 'John': '10', 'Mike': '18'}

Это мой код:

import csv
with open('test.txt') as file:
    tsvfile = csv.reader(file, delimiter='|')
    d = {}

    for row in tsvfile:
        d[row[0]] = row[0] #this should be name
        d[row[0]] = row[1] #this should be gender
        d[row[0]] = row[3] #this should be desc
        d[row[0]] = row[3] #this should be age
    print(d)

Мой желаемый результат, как показано ниже, но не увенчался успехом.

d = {1{'Name':'Amy', 'Gender':'Female', 'Desc': 'Desc1', 'Age': '12'}
 2{'Name':'John', 'Gender':'Male', 'Desc': 'Desc2', 'Age': '10'}
 3{'Name':'Mike', 'Gender':'Male', 'Desc': 'Desc3', 'Age': '18'}}

и ниже (только имя и возраст

d1 = {1{'Name':'Amy','Age': '12'}
 2{'Name':'John', 'Age': '10'}
 3{'Name':'Mike', 'Age': '18'}}

Добро пожаловать в СО! Я не совсем следую желаемому результату, который не является допустимым синтаксисом Python. Если ключи вашего словаря представляют собой последовательные целые числа 1, 2, 3 и т. д., я бы рекомендовал использовать простой старый список. Можешь пояснить свои ожидания? Спасибо.

ggorlen 22.06.2019 09:08

вывод должен быть вложенным словарем, где внешний словарь - это номер строки текстового файла, а внутренний словарь должен быть парой ключ, значение

Jenny 22.06.2019 09:20

Достаточно справедливо, но я бы все же рекомендовал использовать для этого массив или, по крайней мере, обновить вопрос, чтобы отразить правильный синтаксис "1": {} (и т. д.).

ggorlen 22.06.2019 17:48
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
2 592
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Желаемый результат больше похож на список словарей. В этом случае я бы просто изменил ваш код следующим образом:

import csv
with open('test.txt') as file:
    tsvfile = csv.reader(file, delimiter='|')
    d = []

    for row in tsvfile:
        entry = {
          'Name': row[0],
          'Gender': row[1],
          'Desc': row[2],
        }
        d.append(entry)
    print(d)

Выход:

[{'Name': 'Amy', 'Gender': 'Female', 'Desc': 'Desc1'}, 
 {'Name': 'John', 'Gender': 'Male', 'Desc': 'Desc2'}, 
 {'Name': 'Mike', 'Gender': 'Male', 'Desc': 'Desc3'}]

Вы даже можете написать цикл более компактно, например:

keys = ["Name","Gender","Desc"]
for row in tsvfile:
    entry = { key: value for (key,value) in zip(keys,row) }
    d.append(entry)

Обновлено: Если вам нужен словарь с номером строки в качестве ключей, вы можете сделать:

import csv
with open('test.txt') as file:
    tsvfile = csv.reader(file, delimiter='|')
    d = {}
    keys = ["Name","Gender","Desc"]

    for i,row in enumerate(tsvfile):
        entry = {
          'Name': row[0],
          'Gender': row[1],
          'Desc': row[2],
        }
        d[i+1] = entry
    print(d)

Спасибо. На самом деле желаемый результат - это вложенный словарь, где внешним является номер строки текстового файла.

Jenny 22.06.2019 09:17

Если у вас нет пустых строк, это то, что делает список, поскольку для каждой строки вы получаете новую запись. Однако, если вам действительно нужен словарь со строками, вы можете просто перечислить (см. мое редактирование)

Nakor 22.06.2019 09:24

Вот как это сделать без импорта csv, учитывая постоянный формат данных:

fixed = {}
i = 1
with open("test.txt", 'r') as f:
    for line in f:
        listDetails = line.strip().split('|')
        fixed[i] = {"Name": listDetails[0]}
        fixed[i].update({"Sex": listDetails[1]})
        fixed[i].update({"Description": listDetails[2]})
        fixed[i].update({"Age": listDetails[3]})
        i+=1
print(fixed)

Это должно превратить

Amy|Female|Desc1|12 
John|Male|Desc2|10 
Mike|Male|Desc3|18

К

{1: {'Name': 'Amy', 'Sex': 'Female', 'Description': 'Desc1', 'Age': '12'}, 2: {'Name': 'John', 'Sex': 'Male', 'Description': 'Desc2', 'Age': '10'}, 3: {'Name': 'Mike', 'Sex': 'Male', 'Description': 'Desc3', 'Age': '18'}}

Редактировать: как сказал Накор, на самом деле нет смысла делать здесь диктовку, просто опубликовал это, если вам действительно нужно сделать это диктовкой.

Это работает. Спасибо. Мне нужен вложенный словарь в основном для отслеживания номера строки элемента

Jenny 22.06.2019 09:37
Ответ принят как подходящий

1) Вложенный словарь, я внес некоторые изменения в тот же код, это может вам помочь.

import csv
with open('hello.txt') as file:
tsvfile = csv.reader(file, delimiter='|')
final_dict = {}
counter = 1
for row in tsvfile:
    d = {}
    d['Name'] = row[0] #this should be name
    d['Gender'] = row[1] #this should be gender
    d['Desc'] = row[2] #this should be desc
    d['Age'] = row[3] #this should be age
    final_dict[counter] = d
    counter+=1
print(final_dict)

Другие вопросы по теме