2016-11-12 7 views
1

私は自分のニーズに合ったものを探して見つけました。Python 3 | forループ内で複数のif文を使用していますか?

私はそれぞれ3つのループを持っていて、その中にそれぞれ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)) 

いずれかが同じリストの上に3回反復に並置としてこれを行うための最善あるいは最も効率的な方法を提案することはできますか?

+1

文とパッドが '代わりにサイズ4にcolumns'場合は避けることができます:'列+ [なし] *(4-LEN(列)) ' – jfs

+1

は、私が(列)'の使用を見出します**極端に誤解を招く**。何もしません( '(columns)'を 'columns'で置き換えることはできますが、何も変わりません)が、' '(columns、)'と似ています(最後のカンマに注意してください)。 – Bakuriu

答えて

1

全コード:ここで...きれいなものですForceBruの答えの上に

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

は楽しみのための代替です。

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を使用していましたが、これは決して列の長さにはなりません。エラーハンドラはすばらしいものですが、コードがエラーを許容しない場合は必要ありません。 –

+0

Marzochiの答えは、私が投稿したときにはなかった:そう、お互いに彼らの答えを比較していなかったが、私のForcebruの:)。あなたがtry/exceptの保護を必要としないならば、あなたはいつもそれを削除することができます:)。 –

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

sofields [:lenc] – Wera

+0

フィールド[:lenc] do do this fields [:2]は0から2に除外されます: '' no_of_mutual_friends' ' いつも '' name''と '' already_friends' 'がある場合は、フィールドリストの順序を変更する必要があります。 – Wera

関連する問題