1

在 Python 中,给定一个 itme 获取浅元组的索引的优雅方式是什么?

例子

对于单词和拼写变体/别名,获取给定任何变体/别名的单词:

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]

笔记:

  1. 变体在单词中是唯一的。

  2. 我们不想将结构解压缩为(单词,变体)元组。

  3. 以上也可以应用于作为字典中的键的单词或变体,但我认为这种结构更简单。

4

2 回答 2

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))

它会很慢,但是如果您的数据集不是那么大,那可能还可以。

于 2013-09-01T08:54:17.243 回答
0

操作:

我也喜欢:

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
于 2013-09-02T11:31:18.643 回答