2016-02-22 5 views
6

Wie entferne ich die Klammern aus dem Ergebnis, während die Funktion eine einzige Zeile Code bleibt?Meine Funktion gibt eine Liste mit einer einzelnen Ganzzahl zurück. Wie kann ich nur die ganze Zahl zurückgeben?

day_list = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] 

def day_to_number(inp): 
    return [day for day in range(len(day_list)) if day_list[day] == inp] 

print day_to_number("Sunday") 
print day_to_number("Monday") 
print day_to_number("Tuesday") 
print day_to_number("Wednesday") 
print day_to_number("Thursday") 
print day_to_number("Friday") 
print day_to_number("Saturday") 

Ausgang:

[0] 
[1] 
[2] 
[3] 
[4] 
[5] 
[6] 
+3

Warum nicht mit Wörterbuch mit Schlüssel, Wert?Sie wollen hier nicht wirklich eine Liste. – Maroun

+0

'day_to_number' gibt eine Liste zurück. Geben Sie stattdessen nur das gewünschte Element zurück. Wenn du weißt, dass es nur 1 Element geben wird, nimm einfach ' – Busturdust

Antwort

13

Die Liste Verständnis ist hat :). Wenn Ihre Liste Duplikate nicht enthalten (als Beispieldaten zeigt, tun gerade)

>>> def day_to_number(inp): 
...  return day_list.index(inp) 
... 
>>> day_to_number("Sunday") 
0 

Ich möchte auch Beratung die day_list ein Argument der Funktion zu machen, das heißt:

>>> def day_to_number(inp, days): 
...  return days.index(inp) 
... 
>>> day_to_number("Sunday", day_list) 
0 

Suche it up im globalen Namensraum ist ein bisschen hässlich.

Und das Ganze effizienter zu machen (list.index ist O (n)) verwenden, um ein Wörterbuch:

>>> days = dict(zip(day_list, range(len(day_list)))) 
>>> days 
{'Monday': 1, 'Tuesday': 2, 'Friday': 5, 'Wednesday': 3, 'Thursday': 4, 'Sunday': 0, 'Saturday': 6} 
>>> 
>>> def day_to_number(inp, days): 
...  return days[inp] 
... 
>>> day_to_number("Sunday", days) 
0 
6

Return das erste Element, nicht die Liste:

return [day for day in range(len(day_list)) if day_list[day] == inp][0] 

Aber was Sie wirklich tun wollen, ist Ihre Logik ändern:

return day_list.index(inp) 
+0

Du schlägst mich dazu :( –

3

Versuchen Sie dies:

return [day for day in range(len(day_list)) if day_list[day] == inp][0] 

Dies ist jedoch nicht der effizienteste Weg, dies zu erreichen. Versuchen Sie stattdessen:

day_list.index(inp) 

Ich weiß, es sieht aus wie ich die andere Antwort kopiert, ich schwöre, dass ich nicht viel des Guten

1

Das sieht zu kompliziert. Sie brauchen kein Listenverständnis für diese Aufgabe. Sie können die index() Methode verwenden:

>>> def day_to_number(inp): 
...  return day_list.index(inp) 
... 
>>> day_to_number("Sunday") 
0 
>>> day_to_number("Monday") 
1 
>>> day_to_number("Saturday") 
6 

Wenn Sie einen ungültigen Wert übergeben, wird es eine ValueError

3

erhöhen Dies ist ein guter Anwendungsfall für ein Wörterbuch:

>>> day_map = {day: index for index, day in enumerate(day_list)} 

Verwendung:

>>> day_map['Sunday'] 
0 
>>> day_map['Tuesday'] 
2 
2

Sie könnten auch das Modul verwenden, das hat Konstanten für die Wochentage (in englischer Sprache) definiert:

>>> import calendar 
>>> def day_to_number(day): 
...  return getattr(calendar, day.upper()) 
... 
>>> day_to_number('wednesday') 
2 # Note that 0 = 'Monday' 

Wenn Sie diese verwenden, sollten Sie wahrscheinlich einige Fehlerbehandlung hinzu:

>>> day_to_number('epoch') 
1970 

Oder:

>>> day_to_number('foo') 
Traceback (most recent call last): 
    File "<ipython-input-22-4649e99206ae>", line 1, in <module> 
    day_to_number('foo') 
    File "<ipython-input-14-bf0518eb14b5>", line 2, in day_to_number 
    return getattr(calendar, day.upper()) 
AttributeError: 'module' object has no attribute 'FOO' 
+2

FWIW, die' datetime' und 'calendar' Module sind Gebietsschema-empfindlich. Also, wenn du weißt wie man [locales ] (https://docs.python.org/2/library/locale.html), können Sie die Tag-/Monatsnamen für alle von Ihnen installierten Gebietsschemata abrufen. –