2012-01-16 4 views
0

난 그냥이를 통해 지능형리스트와 함께 연주와 함께했다 :이 파이썬 목록 이해에있어 잘못된 점은 무엇입니까?

h = [ b for b in range(1, 9) for k in range(b, b*10) if k%2==0 for j in range(2*k, k*k)] 

예상 결과 :

h = [1, 2, 3, 4, 5, 6, 7, 8] 

실제 결과가 예상과, len(h) = 196000 항목이 포함되어 있습니다.

어떻게 작동하는지 설명해주십시오.

+1

'h = [b for range (1, 9)]'가 예상 결과를 제공합니다. 다른 모든 것들이 뭐라고 생각하니? – Ben

+0

방금 ​​실험을하다가 j 대신 b를 사용했습니다. 그러나 그 결과는 예상치 못한 결과를 낳았습니다. –

+0

파이썬 2.x에서 [b 범위 (1, 9)] 범위 == (1, 9)'' – wim

답변

4

왜 이것이 예상 된 결과라고 생각하십니까?

h = [] 
for b in range(1, 9): 
    for k in range(b, b*10): 
     if k%2==0: 
      for j in range(2*k, k*k): 
       h.append(b) 

그래서, 8-1에서 각 숫자를 들어, 목록 또한 각 숫자가 얼마나 많은 시간을 볼 수 있습니다

에 많은 시간을 추가합니다 :

코드는 동등하다 groupby의 도움으로 추가되었습니다 :

>>> for i,j in itertools.groupby(h): 
    print(i, sum(1 for i in j)) 

1 80 
2 960 
3 3640 
4 9120 
5 18392 
6 32472 
7 52328 
8 79008 
+0

너는 그것과 같은 까다로운 구문 그게 나를 혼란스럽게 만들었다. 감사 :) –

4

귀하의 목록에있는 완이하는 것과 같습니다

h = [] 
for b in range(1, 9): 
    for k in range(b, b * 10): 
     if k % 2 == 0: 
      for j in range(2 * k, k * k): 
       h.append(b) 

그래서 아마 단순히 중첩 된 지능형리스트에서 루프의 순서에 대한 이해가 잘못이다.

반복문을 반복적으로 확장하여 반복문에 나타나는 순서대로 반복하거나 (삼중 중첩 된 이해를 모두 피하십시오. 이해할 수 없게되는 습관이 있습니다!).