我正在遍历此元组列表,并尝试使其成为包含两个键值对的字典,其中一对是“单词”:“数据”和“计数”:12
在循环中,当我打印(my_dict)时,它可以正确打印我想要的内容,但是当打印final_list时,它为我提供了一个字典列表,其中所有四个条目均为{word:“ javascript”,count:20}
my_list = [("data", 12), ("sql", 13), ("python", 4), ("javascript", 20)]
# make into [{word:"data", count:12},
# {word:"sql", count:13},
# {word:"python", count:4}...etc]
final_list = []
my_dict = {}
for s in my_list:
my_dict["word"] = s[0]
my_dict["count"] = s[1]
# print(my_dict)
final_list.append(my_dict)
print(final_list)
当我在循环中创建my_dict时,它可以工作,但是我想知道为什么这是hapeninng。
答案 0 :(得分:1)
您正在尝试建立包含许多词典的列表,您当前的代码会创建1个词典并将其扔入列表中。您希望列表中的每个元素都是独立词典,它们并不完全相同。最简单的解决方法是在for循环的每一遍中将您的词典声明为新词典:
final_list = []
#my_dict = {} not here
for s in my_list:
my_dict = {} # here instead!
my_dict["word"] = s[0]
my_dict["count"] = s[1]
# print(my_dict)
final_list.append(my_dict)
print(final_list)
这将使代码按您期望的方式起作用
输出:
[{'word': 'data', 'count': 12}, {'word': 'sql', 'count': 13}, {'word': 'python', 'count': 4}, {'word': 'javascript', 'count': 20}]
答案 1 :(得分:0)
my_list = [("data", 12), ("sql", 13), ("python", 4), ("javascript", 20)]
# make into [{word:"data", count:12},
# {word:"sql", count:13},
# {word:"python", count:4}...etc]
final_list = []
my_dict = {}
for s in my_list:
my_dict["word"] = s[0]
my_dict["count"] = s[1]
# print(my_dict)
final_list.append(my_dict.copy())
print(final_list)
输出
[{'count': 12, 'word': 'data'}, {'count': 13, 'word': 'sql'}, {'count': 4, 'word': 'python'}, {'count': 20, 'word': 'javascript'}]
答案 2 :(得分:0)
这是因为您要声明my_dict
在列表外的 。每次修改时,您都在修改相同字典-并将同一字典四次放入列表。
解决方案是在循环的每次迭代中声明新字典。您可以通过将my_dict = {}
放入循环中来完成此操作:
final_list = []
for s in my_list:
my_dict = {}
my_dict["word"] = s[0]
my_dict["count"] = s[1]
# print(my_dict)
final_list.append(my_dict)
您还可以通过完全消除帮助程序变量并进行列表理解来简化代码:
final_list = [{'word': s[0], 'count': s[1]} for s in my_list]
答案 3 :(得分:0)
您需要在迭代时添加新字典:
my_list = [("data", 12), ("sql", 13), ("python", 4), ("javascript", 20)]
result = []
for word, count in my_list:
result.append({"word": word, "count": count})
print(result)
# [{'word': 'data', 'count': 12}, {'word': 'sql', 'count': 13}, {'word': 'python', 'count': 4}, {'word': 'javascript', 'count': 20}]
您还可以使用列表理解:
result = [{"word": word, "count": count} for word, count in my_list]
答案 4 :(得分:0)
我想知道为什么这是hapeninng。
正如我在评论中提到的,您在循环之前分配一次dict对象,并在每次迭代中使用相同的对象。结果,您获得了对相同字典的引用列表。
您可以使用简单的列表理解替换此代码:
my_list = [("data", 12), ("sql", 13), ("python", 4), ("javascript", 20)]
final_list = [{"word": key, "count": value} for key, value in my_list]
输出:
[{'word': 'data', 'count': 12}, {'word': 'sql', 'count': 13}, {'word': 'python', 'count': 4}, {'word': 'javascript', 'count': 20}]
答案 5 :(得分:0)
看看这部分...
for s in my_list:
my_dict["word"] = s[0]
my_dict["count"] = s[1]
每次循环遍历时,都会更改字典中的值。因此,有意义的是,字典的最终值将成为元组列表中的最后一项。我希望这是有道理的。
现在查看循环的最后一行...
for s in my_list:
my_dict["word"] = s[0]
my_dict["count"] = s[1]
# print(my_dict)
final_list.append(my_dict)
每次将字典追加到列表时,都不会创建字典的新副本。您正在创建对字典的新引用。因此,列表中的所有字典都指向每次循环都会更改的内存中的同一空间。做您想做的事,您可以选择...
将字典的副本追加到列表中。这会在内存中创建一个具有字典所具有值的新空间,并将其追加到列表中。这样,当您更新my_dict时,先前的值已存储在其他位置。
for s in my_list:
my_dict["word"] = s[0]
my_dict["count"] = s[1]
# print(my_dict)
final_list.append(my_dict.copy())
您可以在每次循环访问值时在内存中创建一个新字典。
for s in my_list:
my_dict = {} # here instead!
my_dict["word"] = s[0]
my_dict["count"] = s[1]
# print(my_dict)
final_list.append(my_dict)
还有其他一些更好的方法,但是希望这可以帮助您解决这个问题。