2017-02-09 48 views
0

我想一个列表转换为dictionnary:Python列表与指标

[A, B, A, A, B, C] 

到dictionnary与每个项目和指标那里发现:

{ A : [0,2,3], B : [1,4], C : [5] } 

一个高效的任何想法如何做到这一点?

回答

2

使用defaultdictenumerate

>>> lst = ['a','b','a','a','b','c'] 
>>> from collections import defaultdict 
>>> d = defaultdict(list) 
>>> for i, value in enumerate(lst): 
...  d[value].append(i) 
... 
>>> d 
defaultdict(<class 'list'>, {'a': [0, 2, 3], 'c': [5], 'b': [1, 4]}) 

或者,这可以用一个简单的dict来完成,虽然,它通常是慢:

>>> lst = ['a','b','a','a','b','c'] 
>>> d = {} 
>>> for i, value in enumerate(lst): 
...  d.setdefault(value, []).append(i) 
... 
>>> d 
{'a': [0, 2, 3], 'c': [5], 'b': [1, 4]} 

你可以有,当然,转换将defaultdict设置为dict

>>> d 
defaultdict(<class 'list'>, {'a': [0, 2, 3], 'c': [5], 'b': [1, 4]}) 
>>> dict(d) 
{'a': [0, 2, 3], 'c': [5], 'b': [1, 4]} 
>>> help(dict) 
+0

@MYGz肯定。 “dict”可能不需要映射。 –

1

使用列表理解和词典理解。首先从列表中创建一个列表。那么你可以很容易地使用枚举并做到这一点。

>>> l = ["A", "B", "A", "A", "B", "C"] 
>>> {i:[j for j,k in enumerate(l) if k==i] for i in set(l)} 
{'C': [5], 'B': [1, 4], 'A': [0, 2, 3]} 
+0

这是低效的。当你设置(l)'时,你会对'l'进行传递,然后'k'多次传递,其中'k'是'l'中唯一元素的数量。 –

2

试试这个,

lst = ['A', 'B', 'A', 'A', 'B', 'C'] 
print {i:[j[0] for j in enumerate(lst) if j[1] == i] for i in set(lst)} 

结果

{'A': [0, 2, 3], 'B': [1, 4], 'C': [5]} 
+0

您不需要通过索引访问元组,直接使用元组解开包装。 –