Task
我正在尝试为字符串中的单词分配数字标识符。
法典
我目前做了以下工作:
mystr = 'who are you you are who'
str_values = mystr.split()
list_values = [str(i) for i, w in enumerate(mystr.split())]
输出:
>>> str_values
['0', '1', '2', '3', '4', '5']
>>> list_values
['who', 'are', 'you', 'you', 'are', 'who']
查询/所需输出
mystr
包含重复的单词,因此我想每次为每个单词分配一个数字而不是不同的数字,但不确定我应该如何开始这样做。因此,我想list_values
输出一些内容:
['0', '1', '2', '2', '1', '0']
您可以在另一个列表的帮助下执行此操作 -
n = []
output = [n.index(i) for i in mystr.split() if i in n or not n.append(i)]
第一个n
是空列表。现在列出理解迭代mystr.split()
的所有元素。如果满足条件,它将在列表中添加元素的索引n
。
现在是条件。有两个部分带有or
.首先,它检查元素是否存在于 n
中。如果是,则获取元素的索引。如果没有,则转到第二部分,该部分只是将元素附加到列表n
。现在append()
返回None
.这就是为什么我在它之前添加了一个 not 的原因。因此,将满足该条件,它将为新插入的元素提供索引。
基本上,if 条件的第一部分限制n
中的重复元素添加,第二部分进行添加。
我们可以分两个阶段工作:
- 首先,我们构建一个字典,将单词映射到索引上,假设它们尚不存在,并且
- 接下来,我们使用字典来获取单词标识符。
喜欢:
identifiers = {}
idx = 0
for word in mystr.split():
if word not in identifiers:
identifiers[word] = idx
idx += 1
list_values = [identifiers[word] for word in mystr.split()]
这将生成:
>>> [identifiers[word] for word in mystr.split()]
[0, 1, 2, 2, 1, 0]
如果需要,您还可以使用 str(..)
将标识符转换为字符串,但我不明白为什么 wou 会这样做:
>>> [str(identifiers[word]) for word in mystr.split()]
['0', '1', '2', '2', '1', '0']
该算法通常在 O(n( 中工作。
您需要使用字典来跟踪已经看到的单词
word_map = {}
word_id_counter = 0
def word_id(word):
global word_id_counter
if word in word_map:
return word_map[word]
else:
word_map[word] = word_id_counter
word_id_counter += 1
return word_map[word]
为了避免使用全局变量,您可以将其包装在类中
class WordIdGenerator:
word_map = {}
word_id_counter = 0
def word_id(self, word):
if word in self.word_map:
return self.word_map[word]
else:
self.word_map[word] = self.word_id_counter
self.word_id_counter += 1
return self.word_map[word]
你可以像这样使用它:
gen = WordIdGenerator()
[gen.word_id(w) for w in 'who are you you are who'.split()]
输出将是:
[0, 1, 2, 2, 1, 0]