使用 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]]
我想创建一个 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]]