首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成倒排索引

生成倒排索引
EN

Stack Overflow用户
提问于 2013-07-04 07:47:11
回答 2查看 2.2K关注 0票数 2

我有以下几点:

代码语言:javascript
复制
strlist = ['the', 'the', 'boy', 'happy', 'boy', 'happy']
{x:{(list(enumerate(strlist))[y])[0]} for y in range(len(strlist)) for x in (strlist)}

我的输出如下:

代码语言:javascript
复制
{'boy': set([5]), 'the': set([5]), 'happy': set([5])}

我的问题是我想输出这个(使用python 3.x):

代码语言:javascript
复制
{'boy': {2,4}, 'the': {0,1}, 'happy': {3,5} }

任何帮助都是最好的!

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-04 07:51:02

代码语言:javascript
复制
>>> strlist = ['the', 'the', 'boy', 'happy', 'boy', 'happy']
>>> from collections import defaultdict
>>> D = defaultdict(set)
>>> for i, s in enumerate(strlist):
...     D[s].add(i)
... 
>>> D
defaultdict(<type 'set'>, {'boy': {2, 4}, 'the': {0, 1}, 'happy': {3, 5}})

如果由于某种原因不能使用defaultdict

代码语言:javascript
复制
>>> D = {}
>>> for i, s in enumerate(strlist):
...     D.setdefault(s, set()).add(i)
... 
>>> D
{'boy': {2, 4}, 'the': {0, 1}, 'happy': {3, 5{}

下面是一种愚蠢的(低效的)方式,把它写成一种理解

代码语言:javascript
复制
>>> {k: {i for i, j in enumerate(strlist) if j == k} for k in set(strlist)}
{'boy': {2, 4}, 'the': {0, 1}, 'happy': {3, 5}}
票数 2
EN

Stack Overflow用户

发布于 2013-07-04 07:54:08

试一试

代码语言:javascript
复制
dict(((string, set(i for i,w in enumerate(strlist) if w == string)) for string in strlist))

但请注意,它有二次运行时,因此它只对非常少量的数据有用。

测试用例和示例输出http://ideone.com/4sxUNf

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17459882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档