2016-11-03 2 views
2

목록이 있으며 '*'가 가장 적은 요소를 찾고 싶습니다. 가장 낮은 수의 목록에서 요소를 가져옵니다. *

mylist = ['12*3','12345**6','11234'] 

그래서이 작은 시험에서 답이 작동 '11234'

하지만 느린 (I 대규모 게놈 데이터로 작업하고 있습니다 :

sorted(mylist, key = lambda x: x.count('*'))[0] 

를이 덜 설득력하지만 작품입니다 :

values = map(lambda x: x.count('*'), mylist) 
print mylist[values.index(min(values))] 

는 더 좋은 방법이 있나요 나는 찌언 트랜스을하려고했다? 형성 그러나 그것을 알아낼 수 없다.

답변

7

당신은 key 매개 변수 min를 사용할 수 있습니다

>>> mylist = ['12*3','12345**6','11234'] 
>>> min(mylist, key=lambda x: x.count('*')) 
'11234' 

key이 (가) sorted에서와 동일한 방식으로 주문을 지정하기 위해 반복 가능한 각 항목에 호출되는 함수입니다. 정렬로 O (N 로그 n) 여기서 접근 위

은 O (N) 시간 복잡도를 초래한다.

업데이트 :이 문자열은 정말 긴 경우 루프에서 *의 발생을 셀 수 카운트가 현재 최소한 동일 즉시 문자열을 거부합니다. 0 발생에 문자열이 발견되면 당신은 또한 검색을 종료 할 수 있습니다 :

def find(l): 
    min_item = None 
    min_val = float('inf') 

    for x in l: 
     current = 0 
     for c in x: 
      current += (c == '*') 
      if current >= min_val: 
       break 
     else: 
      # Found new minimum, update 
      min_item = x 
      min_val = current 

     # Can't get lower than 0 
     if min_val == 0: 
      break 

    return min_item 

print(find(['12*3','11234', '12345**6', '1'])) # '11234' 
1

당신은 더 느린key 대신 lambda로 람다 함수에 대한 별도의 기능을 작성하여 성능을 향상시킬 수 있습니다. 예를 들어 같이

  • lambda 기능 사용 : 1.25 마이크로 초

    mquadri$ python -m "timeit" -s "mylist = ['12*3','12345**6','11234']" "min(mylist, key=lambda x: x.count('*'))" 
    1000000 loops, best of 3: 1.25 usec per loop 
    
  • 분리 기능을 사용하여 : 이하

    def get_asterisk_count(my_string): 
        return my_string.count('*') 
    
    mylist = ['12*3','12345**6','11234'] 
    min(mylist, key=get_asterisk_count) 
    

    timeit 능력치 1.19 마이크로 초

    mquadri$ python -m "timeit" -s "mylist = ['12*3','12345**6','11234']" "def get_asterisk_count(my_string): return my_string.count('*')" "min(mylist, key=get_asterisk_count)" 
    1000000 loops, best of 3: 1.19 usec per loop 
    
  • ,
+0

귀하의 타이밍 차이가 상당하지 않을 것이라고 생각합니다. 확실히 "람다 함수가 느리다"는 주장을 뒷받침 할만큼 충분하지 않거나 - 더 관대하게 느리다. 동일한 스 니펫을 여러 번 실행하면 이름이 지정된 함수가 앞으로 나오고 때로는 '람다'가 앞 당깁니다. 이것은 내가 차이가 순전히 소음 및/또는 혼란스런 요인이라고 믿게한다. AFAIK는 CPython에서'lambda'와'def' 함수의 구현에 실제적인 차이점이 없습니다. 'lambda'의 실행이 동등한 명명 된 함수보다 느린 이유는 없습니다. –

관련 문제