2016-11-12 2 views
1

Ich habe gesucht und nichts gefunden, was meinen Bedürfnissen entspricht.Python 3 | Mehrere if-Anweisungen innerhalb einer for-Schleife verwenden?

Ich habe drei for Schleifen, die jeweils eine if Bedingungen darin hat. Hier ist der Code:

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)) 

Gibt es eine effizientere Möglichkeit, dies zu tun? Ich dachte an den and Operator wie folgt:

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)) 

jeder kann das beste oder effizienteste Weg legen nahe, dies zu iterieren dreimal über die gleiche Liste wie apposed zu tun?

+1

Sie vermeiden können, wenn Aussagen und Pad 'columns' bis Größe 4 statt:' Spalten + [None] * (4-len (Spalten)) ' – jfs

+1

ich Ihre Verwendung von' (Spalten) finden '** extrem ** irreführend. Es tut nichts (Sie können "(Spalten)" durch "Spalten" ersetzen und nichts wird sich ändern), aber es ist ähnlich wie "(Spalten,)" (beachten Sie das letzte Komma!), Die ein 1-Element-Tupel erstellen ... – Bakuriu

Antwort

1

Voll Code hier:

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

Danke MaRZoCHi genau was ich brauchte. Ich entschied mich für Ihre Antwort als die richtige, wie es meiner ursprünglichen Code in seinem Beispiel verwendet –

3

Sie suchen if/elif/else:

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

Danke ForceBru genau was ich brauchte. –

1

Oben ForceBru Antwort, die die sauberste ist ... hier ist eine Alternative zum Spaß.

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

nur darauf hinweisen, dass ForceBru und Marzochi Antworten sind im Grunde das gleiche, mit der Ausnahme, dass Marzochi zu meinen Code präziser war, z.B. ForceBru verwendet die Nummern 5 und 6, die niemals die Länge einer der Spalten haben werden .. und Ihr Error-Handler ist eine coole Ergänzung, wird aber nicht benötigt, wenn der Code keine Fehler zulässt:/aber +1 für die Verwendung von ein "dict" –

+0

Marzochi's Antwort war nicht da, als ich gepostet :) so war nicht ihre Antworten miteinander zu vergleichen, aber Forcebru ist zu mir :). Und danke, wenn Sie keinen Schutz versuchen/außer Sie können es immer entfernen :). –

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

Ich habe Mühe, diesen Code zu verstehen, aber wenn ich in meiner Logik richtig bin, wird die letzte Zeile hier bewirken, dass die Länge der 'Felder' gleich lang ist wie' lenc'? aber ich brauchte auszuschneiden ''no_of_mutual_friends'' & '' no_of_new_posts'' nicht ''no_of_new_posts'' & '' already_friends'' als 'len (Spalten) == 2'. Ich habe immer Namen und already_friends, haben aber nicht immer die anderen –

+0

sofields [: lenc] – Wera

+0

so Felder [: lenc] tun dies Felder [2] ist von 0 bis 2 enthalten ausgeschlossen: ''name'', ‚' no_of_mutual_friends'‘ wenn Sie immer‚'name'‘ und ‚' already_friends'‘haben Sie die Reihenfolge ändern, in Felder – Wera

Verwandte Themen