我想一个列表转换为dictionnary:Python列表与指标
[A, B, A, A, B, C]
到dictionnary与每个项目和指标那里发现:
{ A : [0,2,3], B : [1,4], C : [5] }
一个高效的任何想法如何做到这一点?
我想一个列表转换为dictionnary:Python列表与指标
[A, B, A, A, B, C]
到dictionnary与每个项目和指标那里发现:
{ A : [0,2,3], B : [1,4], C : [5] }
一个高效的任何想法如何做到这一点?
使用defaultdict
和enumerate
:
>>> 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)
使用列表理解和词典理解。首先从列表中创建一个列表。那么你可以很容易地使用枚举并做到这一点。
>>> 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]}
这是低效的。当你设置(l)'时,你会对'l'进行传递,然后'k'多次传递,其中'k'是'l'中唯一元素的数量。 –
试试这个,
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]}
您不需要通过索引访问元组,直接使用元组解开包装。 –
@MYGz肯定。 “dict”可能不需要映射。 –