因此,我想从文本文件中转换字典中的每个字符串,然后将它们添加到列表中。但是我在追加模式上遇到了一些问题。
这是我的代码:
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'}
]
为什么附加项不只是将每个元素添加到下一个元素,而是在之前覆盖该元素?
答案 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/)