2016-11-12 152 views
1

我搜查了一下,找不到適合我需求的東西。Python 3 |在for循環中使用多個if語句?

我有三個for循環,其中每個都有if條件。這裏是代碼:

for friend in friends: 
    columns = friend.split("\n") 
    if len(columns) == 4: 
     c.execute("""INSERT INTO `fb_friends`(`name`, `no_of_mutual_friends`, `no_of_new_posts`, `already_friends`) VALUES (?, ?, ?, ?)""", (columns)) 

for friend in friends: 
    columns = friend.split("\n") 
    if len(columns) == 3: 
     c.execute("""INSERT INTO `fb_friends`(`name`, `no_of_mutual_friends`, `already_friends`) VALUES (?, ?, ?)""", (columns)) 

for friend in friends: 
    columns = friend.split("\n") 
    if len(columns) == 2: 
     c.execute("""INSERT INTO `fb_friends`(`name`, `no_of_mutual_friends`, `already_friends`) VALUES (?, ?, ?)""", (columns)) 

有沒有更有效的方式做到這一點?我在想and運營商,像這樣:

for friend in friends: 
    columns = friend.split("\n") 
    if len(columns) == 4: 
     c.execute("""INSERT INTO `fb_friends`(`name`, `no_of_mutual_friends`, `no_of_new_posts`, `already_friends`) VALUES (?, ?, ?, ?)""", (columns)) 
and 
     if len(columns) == 3: 
     c.execute("""INSERT INTO `fb_friends`(`name`, `no_of_mutual_friends`, `already_friends`) VALUES (?, ?, ?)""", (columns)) 
and 
     if len(columns) == 2: 
     c.execute("""INSERT INTO `fb_friends`(`name`, `already_friends`) VALUES (?, ?)""", (columns)) 

任何一個可以表明這樣做的最好,最有效的方式,以並列在同一目錄遍歷三次?

+1

if語句和墊'columns'大小4相反,你可以迴避:'列+ [無] *(4-LEN(列))' – jfs

+1

我找到你的'(列)使用**非常**誤導。它什麼都不做(你可以用'columns'替換'(columns)',並且什麼都不會改變),但它與創建一個元素元組的'(columns,)'(注意最後的逗號!)類似。 – Bakuriu

回答

1

全部代碼在這裏:

for friend in friends: 
    columns = friend.split("\n") 
    if len(columns) == 4: 
     c.execute("""INSERT INTO `fb_friends`(`name`, `no_of_mutual_friends`, `no_of_new_posts`, `already_friends`) VALUES (?, ?, ?, ?)""", (columns)) 
    elif len(columns) == 3: 
     c.execute("""INSERT INTO `fb_friends`(`name`, `no_of_mutual_friends`, `already_friends`) VALUES (?, ?, ?)""", (columns)) 
    elif len(columns) == 2: 
     c.execute("""INSERT INTO `fb_friends`(`name`, `already_friends`) VALUES (?, ?)""", (columns)) 
+0

謝謝MaRZoCHi正是我所需要的。我選擇了你的答案作爲正確答案,因爲它在我們的例子中使用了我的原始代碼 –

3

您正在尋找if/elif/else

if len(smth) == 5: 
    # do this 
elif len(smth) == 6: 
    # do that 
else: 
    # do something else 
+0

感謝ForceBru正是我所需要的。 –

1

在ForceBru答案的頂部是最乾淨的一個...這裏是一個替代一個樂趣。

d = {2: """INSERT INTO `fb_friends`(`name`, `no_of_mutual_friends`, `already_friends`) VALUES (?, ?, ?)""", 
    3: """INSERT INTO `fb_friends`(`name`, `no_of_mutual_friends`, `already_friends`) VALUES (?, ?, ?)""", 
    4: """INSERT INTO `fb_friends`(`name`, `no_of_mutual_friends`, `no_of_new_posts`, `already_friends`) VALUES (?, ?, ?, ?)"""} 
for friend in friends: 
    columns = friend.split("\n") 
    try: 
     c.execute(d[len(columns)], (columns)) 
    except KeyError: 
     print("you sure about this columns length which was:", len(columns)) 
+0

只需指出ForceBru和MaRZoCHi的答案基本上與MaRZoCHi對我的代碼更具體的例外情況相同。 ForceBru使用的數字5和6永遠不會是任何列的長度..並且您的錯誤處理程序是一個很酷的加法,但不需要如果代碼不允許任何錯誤:/但+1使用一個'dict' –

+0

Marzochi的答案不存在,當我張貼:)所以不是比較他們的答案,而是Forcebru的我的:)。並且,謝謝,如果你不需要保護嘗試/除非你總是可以刪除它:)。 –

1
reqtemplate = "INSERT INTO `fb_friends`(%s) VALUES (%s)" 
fields = ['`name`', '`no_of_mutual_friends`', '`no_of_new_posts`', '`already_friends`'] 
for friend in friends: 
    columns = friend.split("\n") 
    lenc = len(columns) 
    c.execute(reqtemplate % (",".join(fields[:lenc]), ",".join("?" * lenc)), (columns)) 
+0

我很努力去理解這段代碼,但是如果我在我的邏輯中是正確的,那麼這裏的最後一行會導致'fields'的長度與'lenc'長度相等?但是當len(columns)== 2'時,我需要刪除'no_of_mutual_friends''&'no_of_new_posts''而不是'no_of_new_posts''&'already_friends''。我總是有名字和already_friends,但並不總是有其他 –

+0

softields [:lenc] – Wera

+0

所以fields [:lenc]做這個 字段[:2]從0被包括到2被排除:''name'', ''no_of_mutual_friends'' 如果你總是有''name''和''already_friends'',你必須改變字段列表 – Wera