2016-09-06 3 views
-2

나는 간단한 예제를 가지고있다. 사용자에게 숫자를 물어보고 그 숫자의 모든 제수의 목록을 출력하는 프로그램을 만든다.외부 목록을 제거하는 방법?

그리고 난 이런 식으로 해결하고있다 :

n = 4 
list_range = list(range(1,n+1)) 
divisor_list = [] 
divisor_list.append([i for i in list_range if n%i==0]) 
print divisor_list 
#output: 
#[[1, 2, 4]] 

내가 출력 [1, 2, 4]

내가 이것을 달성 할 수있을하려면 :

n = 4 
list_range = list(range(1,n+1)) 
divisor_list = [] 
for i in list_range: 
    if n % i == 0: 
     divisor_list.append(i) 
print divisor_list 
#output: 
#[1, 2, 4] 

그러나 더 나은 방법이있다 이것을 달성?

+0

이것은 http://codereview.stackexchange.com/ – depperm

+2

에 속해있을 수 있습니다'divisor_list = [내가 list_range에 대한 i % n 경우 i == 0]'또는'divisor_list = [] divisor_list + = i [i for list_ran] ge % n = i == 0] 대답 – Xevaquor

+0

답변 해 주셔서 감사합니다 ... 투표하지 마십시오 ... – maharshi

답변

1

숫자의 모든 범위를 반복하는 것은 의미가 없으므로 낭비입니다. 내 CPU에

import math 
import timeit 


def f1(num): 
    return [i for i in range(1, num + 1) if num % i == 0] 


def f2(num): 
    square_root = int(math.sqrt(num)) + 1 
    output = [] 
    for i in range(1, square_root): 
     if (num % i == 0 and i * i != num): 
      output.append(i) 
      output.append(num/i) 
     if (num % i == 0 and i * i == num): 
      output.append(i) 

    return output 


def bench(f, N): 
    for n in range(1, N): 
     f(N) 

N = 10000 
print timeit.timeit('bench(f1, N)', setup='from __main__ import bench, f1, N', number=1) 
print timeit.timeit('bench(f2, N)', setup='from __main__ import bench, f2, N', number=1) 

결과는 다음과 같습니다 :

4.39642974016 
0.124005777533 

F2는 제공하지 않습니다 그냥 N/2 후 더 이상 약수가없는 증명하려고, 여기에 다른 방법 f2를 비교하는 또 다른 벤치 마크 버전입니다 정렬 된 목록,하지만 그건 부적 절한, 당신의 질문에 언급하지 않았다면 귀하의 질문에 언급하지 않았다

+0

을 편집 해주십시오. 왜'f2' 'f1'보다 더 효율적인 성능? – maharshi

1

사용 extend는 : divisor_list.extend([i for i in list_range if n%i==0])

1

당신은 추가 할 필요가 없습니다, 그냥 사용

divisor_list = [i for i in list_range if n% i == 0] 

이 방법 당신은 당신에게 하나 개의 깨끗한 목록을 제공, 지능형리스트의 결과를 할당합니다. 목록을 추가 할 필요가 없으며 목록에 목록을 중첩 할 수 있으며 빈 목록으로 초기화 할 필요가 없습니다. 목록에 다음 줄을 추가 했으므로 중복됩니다. 그냥 목록 이해력에 지정하십시오. @joel의 goldstick가 언급 한 바와 같이, 당신은 할 수 단지 루프 더 1/2 이상의 수 있다면 아무것도 분할 할 수 없기 때문에 list_range의 절반 이상 :

list_range = list(range(1, (n/2) + 1)) 
+2

왜 그럴 수 있습니까? –

+0

@joelgoldstick 네가 맞아! 그걸 내가 편집하게! – Li357

+1

@joelgoldstick 실제로, 나는 전체 스레드에서 배울 수있는 가장 관련있는 것 같아요 ;-), 나는 또한 대답을 언급했습니다. – BPL

1

당신은에 지능형리스트의 결과를 할당 할 수 있습니다 변수.

1

divisor_list을 빈 시퀀스로 초기화 할 필요가 없습니다. 추가하는 이해력은 찾고있는 실제 답변입니다.

divisor_list = [i for i in list_range if n%i==0] 
관련 문제