使用Python的列表元素的位置索引

时间:2015-01-29 22:11:57

标签: python list indexing

我正在寻找创建一个以两个或多个列表作为参数的positional_index函数,并且应该返回doc_id以及各种列表中出现的单词的位置。

前:

index = create_positional_index([['a', 'b', 'a'], ['a', 'c']])
index['a']
[[0, 0, 2], [1, 0]]
index['b']
[[0, 1]]
index['c']
[[1, 1]]

这里第一个'0'代表doc_id,后跟'a'出现在文档0中的位置。因为'a'出现在我们有两个列表的文档中。 'b'仅出现在文档0中,'c'仅出现在文档1 ..

任何人都可以帮我写这个功能吗?

3 个答案:

答案 0 :(得分:0)

您可以使用以下功能:

>>> from itertools import chain
>>> sample_list = [['a', 'b', 'a'], ['a', 'c']]
>>> def find_index(s_list) :
...     for elem in set(chain(*s_list)) :
...        yield {elem:[[i]+[t for t,k in enumerate(j) if k==elem] for i,j in enumerate(s_list)]}
... 
>>> list(find_index(sample_list)
... )
[{'a': [[0, 0, 2], [1, 0]]}, {'c': [[0], [1, 1]]}, {'b': [[0, 1], [1]]}]

这里需要的所有内容都是在两个列表理解中使用enumerate。请注意set(chain(*s_list))会为您的所有子列表创建一组唯一元素。

答案 1 :(得分:0)

我建议使用dict' s作为doc_id。

编辑:将功能更改为OP输出格式。

class create_positional_index():
    def __init__(self, lst):
        self.lst = lst
    def __getitem__(self, elm):
        return [[doc_id] + [pos for pos, key  in enumerate(sub_lst) if key==elm] for doc_id, sub_lst in enumerate(self.lst) if elm in sub_lst]

index = create_positional_index([['a', 'b', 'a'], ['a', 'c']])
print index['a']
print index['b']
print index['c']

def create_positional_index2(lst, elm):
    return [[doc_id] + [pos for pos, key  in enumerate(sub_lst) if key==elm] for doc_id, sub_lst in enumerate(lst) if elm in sub_lst]

print create_positional_index2([['a', 'b', 'a'], ['a', 'c']], 'a')
print create_positional_index2([['a', 'b', 'a'], ['a', 'c']], 'b')
print create_positional_index2([['a', 'b', 'a'], ['a', 'c']], 'c')

答案 2 :(得分:0)

我发现理解你的问题相当困难。然而,尽管如此,在查看其他答案以及您的评论之后,我认为以下将是实现您的目标的好方法。它定义了一个dict的子类来保存索引,因此您也可以在任何创建的实例上使用常规字典方法,如keys()items()update

from itertools import chain

class PositionalIndex(dict):
    def __init__(self, *lists):
        self.update(
            (doc_id, [[i]+[j for j, k in enumerate(sublist) if k == doc_id]
                        for i, sublist in enumerate(lists)])
                            for doc_id in set(chain.from_iterable(lists)))

index = PositionalIndex(['a', 'b', 'a'], ['a', 'c'])

for doc_id in sorted(index):
    print('index[{!r}] --> {}'.format(doc_id, index[doc_id]))

输出:

index['a'] --> [[0, 0, 2], [1, 0]]
index['b'] --> [[0, 1], [1]]
index['c'] --> [[0], [1, 1]]