Проблема со строковым преобразованием в dict, а затем добавить в список - PullRequest
1 голос
/ 10 марта 2020

Итак, я хочу из текстового файла преобразовать каждую строку в dict, а затем добавить каждую из них в список. Но у меня есть некоторые проблемы с режимом добавления.

Вот мой код:

contenuto_dei_file = [
    'Jund Food\nPioneer',
    'Blue Moon\nModern'
    'Izzet\nPioneer'
]


def parse_decks_content(contenuto):
    d = {}
    decks = []
    for element in contenuto:
        element = element.splitlines()
        d["name"] = element[0]
        d["formato"] = element[1]
        print(d)
        decks.append(d)

    return decks


decks_come_dizionari = parse_decks_content(contenuto_dei_file)
print(decks_come_dizionari)

Желаемый результат:

decks = [
    { 'name': 'Jund Food', 'formato': 'Pioneer', },
    { 'name': 'Blue Moon', 'formato': 'Modern', },
    {'name': 'Izzet', 'formato': 'Pioneer'}
]

Мой код выдает следующее:

decks = [
    {'name': 'Izzet', 'formato': 'Pioneer'},
    {'name': 'Izzet', 'formato': 'Pioneer'},
    {'name': 'Izzet', 'formato': 'Pioneer'}
]

Почему приложение не просто добавляет каждый элемент к следующему, а вместо этого переопределяет элемент раньше?

Ответы [ 3 ]

2 голосов
/ 10 марта 2020

Это не переопределение, у вас просто один и тот же словарь, вы должны создавать новый словарь на каждой итерации.

Сделайте это вместо:

contenuto_dei_file = [
    'Jund Food\nPioneer',
    'Blue Moon\nModern'
    'Izzet\nPioneer'
]


def parse_decks_content(contenuto):
    decks = []
    for element in contenuto:
        d = {}
        element = element.splitlines()
        d["name"] = element[0]
        d["formato"] = element[1]
        print(d)
        decks.append(d)

    return decks


decks_come_dizionari = parse_decks_content(contenuto_dei_file)
print(decks_come_dizionari)
1 голос
/ 10 марта 2020

Как упоминали Томерику и Тайлер, вы добавляете ссылку к словарю в список вместо содержимого самого списка.

Это означает, что к концу итерации в вашем примере, decks содержит 3 ссылки на d , как это было совсем недавно - {'name': 'Izzet', 'formato': 'Pioneer'}.

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

Другой способ - скопировать содержимое словаря в то время, используя метод copy() dict class:

def parse_decks_content(contenuto):
    d = {}
    decks = []
    for element in contenuto:
        element = element.splitlines()
        d["name"] = element[0]
        d["formato"] = element[1]
        print(d)
        decks.append(d.copy())

    return decks

Единственная потенциальная проблема с использованием copy заключается в том, что он возвращает «мелкую» копию - если в словаре, который вы копируете, есть изменяемые объекты, они могут быть "перезаписано", как вы испытали По этой причине я бы рекомендовал каждый раз создавать новый словарь, как и в других ответах.

(Объяснение метода copy и различия между «мелкими» и «глубокими» копиями можно найти здесь: https://thispointer.com/python-how-to-copy-a-dictionary-shallow-copy-vs-deep-copy/)

1 голос
/ 10 марта 2020

вы можете использовать понимание списка:

[{'nome': f, 'formato': s} for i in contenuto_dei_file for f, s in [i.split('\n')]]

вывод:

[{'nome': 'Jund Food', 'formato': 'Pioneer'},
 {'nome': 'Blue Moon', 'formato': 'Modern'},
 {'nome': 'Izzet', 'formato': 'Pioneer'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...