获取给定元组中的项目的浅元组/列表的索引

时间:2013-09-01 08:42:56

标签: python sequences

在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]

注意:

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

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

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

2 个答案:

答案 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