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

Positional index of list elements using Python

我想创建一个 positional_index 函数,它接受两个或多个列表作为参数,并且应该 return 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..

谁能帮我写这个函数?

您可以使用以下功能:

>>> 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)) 为您的所有 sub_lists 创建一组独特的元素。

我建议对 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')

我发现很难理解你的问题。然而尽管如此,在查看了其他答案和您的评论之后,我认为以下将是实现您的目标的好方法。它定义了 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]]