我有一个vocabulary
,这是一个单词列表。我的数据框posts
有两列,words
和wordsdictcoded
。第一个包含像['this', 'is']
这样的单词列表。词汇表包含words
列中显示的所有单词。
wordsdictcoded
列应包含已编码的字词。编码的工作方式如下:每个单词由词汇表长度中的0和1数组表示。 words
列由词汇表编码:如果words
第n个单词是词汇表中的第i个,则编码的第i个元素将为1。
的Fe:
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
但是,对于每一行帖子而言,我最终都会获得所有1个字词[' wordsdictcoded']。我不明白。如果我只运行range(0,1)
的循环,即使print(posts['wordsdictcoded'][5]
获取值,所有行都会得到值。为什么呢?
答案 0 :(得分:2)
这是一个常见的python问题。问题是[listofzeros] * len(posts)
复制相同的列表len
次,它不会创建副本。你可以测试那个
id(posts['wordsdictcoded'][0]) == id(posts['wordsdictcoded'][1])
请参阅下面的评论(由用户DYZ
)以获取解决方案
答案 1 :(得分:0)
正如在另一个答案中所说,问题在于*
运算符创建了对相同列表的另一个引用。一种可能的解决方案是强制Python创建多个不同的列表:
posts['wordsdictcoded'] = [[0] * len(vocabulary) for _ in range(len(posts))]