python遍历元组列表并创建字典列表

时间:2019-05-21 17:36:16

标签: python

我正在遍历此元组列表,并尝试使其成为包含两个键值对的字典,其中一对是“单词”:“数据”和“计数”: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。

6 个答案:

答案 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)

还有其他一些更好的方法,但是希望这可以帮助您解决这个问题。