生成逆索引

时间:2013-07-03 23:47:11

标签: python dictionary python-3.x inverse

我有以下内容:

strlist = ['the', 'the', 'boy', 'happy', 'boy', 'happy']
{x:{(list(enumerate(strlist))[y])[0]} for y in range(len(strlist)) for x in (strlist)}

我的输出如下:

{'boy': set([5]), 'the': set([5]), 'happy': set([5])}

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

{'boy': {2,4}, 'the': {0,1}, 'happy': {3,5} }

任何帮助都会很棒!

由于

2 个答案:

答案 0 :(得分:2)

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

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

这是将其理解为理解的愚蠢(低效)方式

>>> {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}}

答案 1 :(得分:2)

尝试

dict(((string, set(i for i,w in enumerate(strlist) if w == string)) for string in strlist))

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

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