在Python中获得一个浅层元组索引的优雅方法是什么呢?
对于单词和拼写变体/别名,请获取给定任何变体/别名的单词:
words = (('word1')
('word2', 'variant2_1')
('word3', 'variant3_1', 'variant3_2')
...
)
word = get_some_word()
if index_of_tuple_containing_word != None:
word = words[index][0]
注意:
变体在单词中是唯一的。
我们不想将结构解压缩为(单词,变体)元组。
以上内容也适用于单词或变体作为词典中的键,但我认为这种结构更简单。
答案 0 :(得分:3)
对于这个例子,我将从单词变体到其规范形式制作一个词典:
words = {'word1': 'word1',
'word2': 'word2', 'variant2_1': 'word2',
'word3': 'word3', 'variant3_1': 'word3', 'variant3_2': 'word3',
...
}
word = words[word]
查找是常量时间,与元组元组不同,查找需要通过大约一半的数据结构进行强力搜索。如果您想要单词的所有变体,则该值可以是变体列表。
如果由于某种原因你真的想把你的数据组织成一个元组元组,并且你真的想要计算一个外部元组的索引,你可以编写一个函数来轻松地做到这一点:
def outer_index(item, nested_tuple):
for i, inner_tuple in enumerate(nested_tuple):
if item in inner_tuple:
return i
raise ValueError('{} is not in the nested tuple'.format(item))
它会很慢,但是如果你的数据集不那么大,那就可以了。
答案 1 :(得分:0)
OP:
我也很喜欢:
words = ( ('word1',('word1', 'alias11', 'alias111')),
('word2',('word2', 'alias22', 'alias222')),
('word3',('word3',)) )
someword = 'alias11'
lst = [cword for cword,aliases in words if someword in aliases]
canonical = lst[0] if lst else None