循环更改甚至没有循环通过的行的数据?

2024-10-03 17:26:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个vocabulary,这是一个单词列表。我有一个数据帧posts,有两列,wordswordsdictcoded。第一个包含像['this', 'is']这样的单词列表。词汇表包含出现在words列中的所有单词。 wordsdictcoded列应该包含编码的单词。编码的工作原理是这样的:每个单词在词汇表的长度上由0和1组成的数组表示。words列由词汇表编码:如果第words个单词是词汇表中的第i个单词,则编码的第i个元素将是1。 铁:

vocabulary = ['this', 'is' 'a', 'test']
words[i] = ['a', 'test']
wordsdictcoded[i] = [0, 0, 1, 1]

这就是我想要达到的目标。我的代码是:

listofzeros = [0] * len(vocabulary)
posts['wordsdictcoded'] = [listofzeros] * len(posts)
for i in range(0, len(posts)):
    for word in posts['words'][i]:
        posts['wordsdictcoded'][i][vocabulary.index(word)] = 1

然而,我最终得到了每一行posts['wordsdictcoded']的所有1。我不明白。如果我只是为range(0,1)运行循环,即使print(posts['wordsdictcoded'][5]得到值,所有行都得到值。为什么


Tags: 词汇表intest编码列表forlenis
2条回答

正如在另一个答案中所说的,您的问题是*操作符创建了对相同列表的另一个引用。一种可能的解决方案是强制Python创建多个不同的列表:

posts['wordsdictcoded'] = [[0] * len(vocabulary) for _ in range(len(posts))]

这是一条普通的Python。问题是[listofzeros] * len(posts)复制同一列表len次,它不会创建副本。你可以测试一下

id(posts['wordsdictcoded'][0]) == id(posts['wordsdictcoded'][1])

有关解决方案,请参见下面的注释(由用户DYZ

相关问题 更多 >