字典中的字符串转换问题,然后添加到列表

时间:2020-03-10 14:59:19

标签: python-3.x list dictionary append

因此,我想从文本文件中转换字典中的每个字符串,然后将它们添加到列表中。但是我在追加模式上遇到了一些问题。

这是我的代码:

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 个答案:

答案 0 :(得分:2)

这不是重写,您只有相同的字典,您应该在每次迭代中创建一个新字典。

改为执行此操作:

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 :(得分:1)

您可以使用列表理解:

[{'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'}]

答案 2 :(得分:1)

就像Tomerikoo和Tyler提到的那样,您是将引用附加到列表的字典中,而不是列表本身的内容。

这意味着在示例的迭代结束时,decks包含3个对d 的引用,因为它是最近的-即{'name': 'Izzet', 'formato': 'Pioneer'}

发生这种情况时,解决此问题的一种方法是(正如人们已经提到的)每次处理一个元素时都要创建一个新字典。

另一种方法是在那时使用copy()类的dict方法复制字典的内容:

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/