2011-07-13 88 views
1

我在這裏消隱。我想抓取用戶庫中的所有用戶,但只能循環訪問其中的10個用戶(我遺漏了代碼,這將解釋爲什麼我不會從第一個數據庫中抓取10個用戶)。Python while循環問題

users = User.objects.all() 
i = 0 
while i < 10: 
    for user in users: 
     if user.is_active: 
      # do something 
      i += 1 

這是創造一個無盡的循環......我錯過了什麼愚蠢的細節?

+0

user.is_active條件不是10次或更多次如此。當我<10時,你需要i + = 1。現在,其下,如果user.is_active: – zengr

+0

你有超過10活躍用戶在數據庫? – mrbox

+0

請注意,你也正在迭代和_doing something_在所有活躍用戶**無論如何,因爲行動是在'用戶'循環中的用戶(即**所有**),而'''檢查出了循環.. – neurino

回答

8

如果你想尋找10 活躍的用戶,你需要更聰明一些。

for user in itertools.islice((x for x in users if x.is_active), 10): 
    # do something 
+1

現在這是一個115k的答案! ;) – zengr

1

只有通過所有用戶,纔會評估while循環條件。您可以刪除while,並在for循環的末尾添加if i >= 10: break

2

實際上,這並不是無止境的,它只是貫穿所有用戶10次。

如果你想第一個10個用戶(無論他們是否是活躍與否):

while i < 10: 
    user = users[i] 
    if user.is_active: 
     # do something 
    i += 1 

如果你想第10個活躍用戶:

for user in users: 
    if user.is_active: 
     #do something 
     i += 1 
    if i >= 10: 
     break 
+0

你的第一個陳述是錯誤的,你的代碼示例將不起作用。如果其中一個'users [:10]'無效,它將創建一個無限循環。 –

+0

你確定這會按預期工作嗎?我的意思是,我只增加用戶活躍,但如果有活躍和不活躍的用戶混合然後呢? –

+0

你們都是對的!它現在是固定的(我希望)。 – TorelTwiddler

0

儘量按照你的代碼在紙上,看看它做了什麼。你會注意到你並沒有抓住前十名用戶,但你正在遍歷所有用戶十次。 for循環在users中遍歷所有user,而while循環重複執行for循環十次。

+0

這隻有在只有一個用戶處於活動狀態時纔會如此。 –

+0

@Tim我不明白你的意思。 –

+0

如果有十個用戶處於活動狀態,那麼在'for'循環結束時'i'爲'10',所以'while'條件在'while循環中只有一次運行後就變爲'False'。 –

0

Mabybe您i從未達到10.也許連10用戶主動的。

也許i > 10並且在發生這種情況之前未檢查條件。

filter(lambda u:u.is_active, users)[:10] 
0

這似乎是你的代碼就相當於

users = User.objects.filter(is_active=True)[:10] 
for user in users: 
    #do something 

提供你有十個用戶。

0

除了使用特殊的迭代器(有時你可以導入幾十行代碼來編寫你的代碼,你可以稱它爲聰明的^^,而你可以用5行代碼和不導入)我認爲這是使用breakfor循環

users = User.objects.all() 
i = 0 
for user in users: 
    if user.is_active: 
     #do something 
     i += 1 
    if i == 10: 
     break 
else: 
    #do something if less than 10 active users (if necessary) 
0

使用列表理解典型案例:

[user for user in User.objects.all() if user.is_active][:10] 

而如果你需要執行上,你可以再次使用列表理解這些用戶的任何行動:

[action(usr) for usr in [user for user in User.objects.all() if user.is_active][:10]] 

或者地圖:

map(action, [user for user in User.objects.all() if user.is_active][:10])