我有一个单词对列表,并希望描述ID上的单词。id应该从0到len(set(words))。现在的列表如下所示:
[['pluripotent', 'Scharte'],
['Halswirbel', 'präventiv'],
['Kleiber', 'Blauspecht'],
['Kleiber', 'Scheidung'],
['Nillenlutscher', 'Salzstangenlecker']]
结果应该具有相同的格式,但是使用id代替。例如:
[[0, 1],
[2, 3],
[4, 5],
[4, 6],
[7, 8]]
到目前为止,我有这个,但它没有给我正确的输出:
def words_to_ids(labels):
vocabulary = []
word_to_id = {}
ids = []
for word1,word2 in labels:
vocabulary.append(word1)
vocabulary.append(word2)
for i, word in enumerate(vocabulary):
word_to_id [word] = i
for word1,word2 in labels:
ids.append([word_to_id [word1], word_to_id [word1]])
print(ids)
输出:
[[0, 0], [2, 2], [6, 6], [6, 6], [8, 8]]
它是在有唯一单词的地方重复id。你知道吗
有两个问题:
word_to_id
中重复查找word1
而造成了一个输入错误。你知道吗word_to_id
字典时,只需要考虑唯一值。你知道吗例如,在Python 3.7+中,可以利用插入顺序字典:
3.7之前版本的另一种选择是使用^{} 或^{} ^{} recipe 。你知道吗
如果没有订购要求,您可以使用
set(vocabulary)
。你知道吗你有两个错误。首先,你有一个简单的打字错误,这里:
您正在添加
word1
的id两次,在那里。改为更正第二个word1
以查找word2
。你知道吗接下来,您将不测试您以前是否见过一个单词,因此对于
'Kleiber'
,您首先给它id4
,然后在下一次迭代中用6
覆盖该条目。您需要给出唯一的单词编号,而不是所有单词:或者,如果已经列出了一个单词,就不能简单地将该单词添加到
vocabulary
。顺便说一句,你不需要一个单独的vocabulary
列表。单独的循环不会为您带来任何好处,因此以下方法也很有效:通过使用^{} object 和^{} 来提供默认值,可以大大简化代码:
每次调用
__next__
时,count()
对象都会给您一个序列中的下一个整数值,每次尝试访问字典中尚不存在的键时,defaultdict()
都会调用该整数值。它们一起确保了每个唯一单词的唯一ID。你知道吗相关问题 更多 >
编程相关推荐