2017-04-19 1 views
1

내가 배열에리스트의 인덱스를 저장하고 싶었파이썬 - 주문 DICT

[OrderedDict([('a', 1), ('b', 2)]), OrderedDict([('a', 1), ('b', 3)]), OrderedDict([('a', 2), ('b', 2)]), OrderedDict([('a', 3), ('b', 2)]), OrderedDict([('a', 1), ('b', 3)])] 

다음과 같이 유사하게 보이는 주문한 DICT의 목록을 보내고있어 목록에서 일치하는 값에 대한 모든 인덱스를 찾기하는 그래서, 내 목록 요소 아래에 포함됩니다 1a 값이된다

[0,1,4]

나는이 값을 얻기 위해 전통적인 스크립트를 사용하고 있지만, 원래의 목록에는 100 만 개 이상의 주문 된 dict가 있기 때문에 요소를 가져 오는 데 더 오랜 시간이 걸립니다.

for ele in range(len(liso)): 
if(liso[ele]['a'] ==1): 
    giso.add(ele) 

사람이 쿼리를 최적화하기 위해 map 또는 filter를 사용하여 위의 스크립트를 다시 작성하는 데 도움이 수 있습니까?

+0

첫째, 파이썬의 버전입니다 이? 또한 '기소'는 정확히 무엇입니까? – roganjosh

답변

2

목록 이해 : [i for i, x in enumerate(liso) if x['a'] == 1]

필터 : 파이썬 2를 사용하는 경우

는 : filter(lambda i: liso[i]['a'] == 1, xrange(len(liso)))

파이썬 3 사용하는 경우 : list(filter(lambda i: liso[i]['a'] == 1, range(len(liso))))

+1

왜 여기에'range (len())'를 쓰겠습니까? 특히 이것이 파이썬 2 인 경우 – roganjosh

+0

@roganjosh 다른 무엇을 권하고 싶습니까? –

+0

노트북이 휴대 전화로 사망하여 서식이 잘못되었습니다. 파이썬 2에서는 범위가 반복자가 아닌 전체 목록을 생성합니다. 파이썬 2에서는 대신'xrange'를 사용하십시오 (OP는 제 질문에서 분명히하지 않았습니다). 이 예제의 경우 : [item [ 'a'] == 1]'인 경우 liso의 item item '. – roganjosh