2016-10-14 2 views

답변

3

당신은 list 기본 공장 defaultdict를 사용할 수 있습니다 defaultdict에게 주어진

>>> from collections import defaultdict 
>>> a = ['a', 'b', 'a'] 
>>> res = defaultdict(list) 
>>> for i, s in enumerate(a): 
...  res[s].append(i) 
... 
>>> res 
defaultdict(<type 'list'>, {'a': [0, 2], 'b': [1]}) 

매개 변수가 존재하지 않습니다 키를 주어진 경우에 초기 값을 제공하기 위해 호출되는 함수입니다. 한 번 원래 목록이 반복되고 있으므로 list.append의 시간 복잡도는 입니다. O (1) 총 시간 복잡도는 O (n)입니다. 다른 솔루션의

업데이트 성능 비교 :

from collections import defaultdict 

def test1(l): 
    b = dict.fromkeys(set(l), []) 
    for i, val in enumerate(l): 
     b[val] = b.get(val)+[i] 

def test2(l): 
    res = defaultdict(list) 
    for i, s in enumerate(l): 
     res[s].append(i) 

if __name__ == '__main__': 
    import timeit 
    print(timeit.timeit("test1(['a'] * 1000)", setup="from __main__ import test1", number=10)) 
    print(timeit.timeit("test2(['a'] * 1000)", setup="from __main__ import test2", number=10)) 

출력 :

0.03234261799661908 
0.000929353991523385 
2
a = ['a', 'b', 'a'] 
b = dict.fromkeys(set(a), []) # {'a': [], 'b': []} 
for i, val in enumerate(a): 
    b[val].append(i) 

print (b) 

을 제공합니다

{'a': [0, 2], 'b': [1]} 
+0

을 모든이를 반복에서이 새로운 목록을 생성하기 때문에 최악의 경우의 시간 복잡도는 ** O (n^2) **이므로 대부분의 인덱스에 동일한 값이 포함되어있는 경우 더 긴 목록을 사용하는 것이 가능하지 않습니다. – niemmi

관련 문제