2016-04-15 8 views
4

Ich habe Schwierigkeiten mit dieser Zuweisung, indem ich zweidimensionale Listen verwende und sie mit Zahlen bevölkere. Die Zuordnung ist:Zweidimensionale Listenpopulation in Python

Erstellen Sie eine Tabelle eine zweidimensionale Liste verwenden, die eine Fahrenheit Temperatur und die entsprechende Temperatur in Celsius speichert. Verwenden Sie den folgenden Bereich von Fahrenheit Temperaturen: -10 bis 100 in Schritten von 10.

ich versuche stecken die erste Spalte meiner zweidimensionalen Liste zu füllen mit Zahlen -10 bis 100. Was ich habe, so weit:

ROWS = 11 
COLS = 2 


def main(): 
    list = [[0,0], 
      [0,0], 
      [0,0], 
      [0,0], 
      [0,0], 
      [0,0], 
      [0,0], 
      [0,0], 
      [0,0], 
      [0,0], 
      [0,0]] 

    for i in range(ROWS):   
     for i in range(-10,110,10): 
       list.insert(0, i) 

    print(list) 


main() 
+2

Sie wollen sicherlich nicht die gleiche Variable 'i' in Ihren beiden Loops verwenden. Das wird nicht sehr gut funktionieren. – Gerrat

+0

Warte, warum -10 ° F? Ich dachte, du wurdest gebeten, 10 bis 100 ° F zu machen. – Jerrybibo

+0

Das war ein Tippfehler. Startet bei -10. –

Antwort

3

Was Sie suchen ist ein list comprehension:

def inCelsius(temperature): 
    return (temperature/2) - 20 

x = [[temperature, inCelsius(temperature)] for temperature in range(-10, 110, 10)] 

Dies ergibt:

>>> x 
[[-10, -25.0], [0, -20.0], [10, -15.0], [20, -10.0], [30, -5.0], [40, 0.0], [50, 5.0], [60, 10.0], [70, 15.0], [80, 20.0], [90, 25.0], [100, 30.0]] 

Offensichtlich wäre Ihre inCelsius() Konvertierung anders.

Beachten Sie, dass Sie die Liste nicht im Voraus einrichten müssen. das Listenverständnis macht das für dich. Beachten Sie auch, dass Pythons list insert() das bereitgestellte Element an der angegebenen Position einfügen wird. Das heißt, es wird erhöhen die Größe Ihrer Liste - die Sie nicht möchten, wenn Sie Ihre zweidimensionale Liste von Grund auf neu wachsen.

schließlich ein dictionary comprehension würde Ihre Datenstruktur nützlicher machen:

conversion = {temperature: inCelsius(temperature) for temperature in range(-10, 110, 10)} 

Dies bedeutet, dass Sie conversion als ‚vorberechneten Cache‘ verwenden können, um den Wert einer Farenheit Temperatur in Celsius zu sehen:

>>> conversion[10] 
-15.0 

Dies bedeutet, dass Sie nur die Temperaturen einmal pro Wert berechnen. Dies ist eine Optimierung, die nützlich sein kann, wenn die Konvertierung kompliziert oder prozessorintensiv ist.

+0

Also List Verständnis bedeutet im Grunde, Sie können die for-Schleife in der gleichen Zeile hinzufügen, wo Sie die Liste definiert? Dies ist nicht etwas in unserem Buch, oder etwas, das wir über den Unterricht gingen, aber ich bin sicher, der Professor wird es akzeptieren (hoffe ich). Danke für Ihre Hilfe –

+1

Ja ... obwohl es auch als eine 'natürlichere' Art gesehen wird, die Idee zu sagen 'Ich möchte eine Liste bestehend aus 'y' Elementen für jedes Element in' y' Bereich/Liste/Satz' . –

+1

Ja, Ihr Weg scheint viel leichter zu erinnern und logischer. Ich schätze es –

0

Für eine Liste von Listen ist es am besten, wenn Sie bestimmten Indizes Indizes zuweisen, indem Sie die Liste selbst indexieren. Um ehrlich zu sein, ich habe die .insert() Methode nie benutzt. (Ich sehe nicht den Punkt davon, denn sonst könnte man nur Liste Verkettung verwenden.)

Teilen wir uns diese Antwort auf mehrere Teile:

Lösung des Problems

Zuerst lernen wie man eine Liste indexiert (auch eine Liste von Listen). Wahrscheinlich haben Sie das entweder noch nicht gelernt oder Sie haben es einfach vergessen. Hier ein Beispiel:

>>> listA = ["Hello", "Hi", "Greetings"] 
>>> listA[1]   # Returns the object at index 1 of the list, or the second object 
"Hi" 
>>> listB = [["1st object in list 1", "2nd object in list 1"], ["1st object in list 2", "2nd object in list 2"]] 
>>> listB[0][1]   # Returns the object at index 1 of the object at index 0 of the larger list, which in this case would be: 
"2nd object in list 1" 

Wie ist das nützlich? Sie können der Liste auf diese Weise direkt Elemente zuweisen. Beispiel:

>>> listC = [[1, 2],[3, 4]] 
>>> listC 
[[1, 2], [3, 4]] 
>>> listC[1][1] = 100 
>>> listC 
[[1, 2], [3, 100]] 

Verwenden Sie das, um die vorhandene Liste zu ändern, die Sie in der Hauptfunktion erstellt haben. Sie sollten wahrscheinlich eine for-Schleife verwenden.

Making Things Bessere

(Mißachtung, wenn Sie in Eile sind)

Es gibt einige Möglichkeiten, die Sie später bei der Codierung größer und komplexer Projekte helfen könnte, so dass es Ihnen helfen könnte in Zukunft schneller und effizienter debuggen.

  • Mit dem variablen i zweimal in der for-Schleife verschachtelt ist nicht wirklich eine gute Idee. Es kann Sie ziemlich leicht verwirren, weil Sie nicht sicher sein werden, auf welches i Sie sich beziehen.

  • Verwenden Sie mehr benutzerdefinierte Funktionen. Alles in main zu bringen wird dir nicht wirklich helfen, denn es ist im Prinzip das Gleiche wie wenn du alles ohne die main() Funktion schreibst. Von jetzt an gehe ich davon aus, dass Sie in Zukunft mehr Funktionen übernehmen werden. Wenn das der Fall ist, ignorieren Sie dies einfach.

  • Das Definieren einer sehr langen Liste, die die gleichen Objekte in jedem "Slot" enthält, kann mit dem Multiplikationsoperator einfacher gemacht werden. Sie möchten beispielsweise eine Liste mit 10 Objekten erstellen, die alle die Ganzzahl 42 enthalten. Anstatt das zu tippen, hättest du einfach listA = [42] * 10 machen können. Das spart viel Zeit.

  • Die Liste mit dem Namen list zu definieren ist eine ziemlich schlechte Idee. Was, wenn Sie die Funktion list() später verwenden möchten? Sie würden von einem schrecklichen TypeError: '[some type]' object is not callable begrüßt werden. Anstatt den Namen list als Namen zu verwenden, ändern Sie ihn in etwas wie temperatures oder etwas anderes, das beschreibender ist.

+0

Wer meine Antwort abgelehnt hat, was ist deine Argumentation? – Jerrybibo

+0

Ich denke, jemand fand deine Antwort nicht effizient. Und im Vergleich zu Nathaniels Antwort stimme ich ein wenig zu (nicht mein Downvote). Sie müssen nicht die gesamte Liste erstellen und dann jeden Wert einzeln mithilfe von Indizes zuweisen. Dies würde zu viel Code benötigen. Nathaniels Lösung, Listen Listen Comprehensions ist kurz, effizient und elegant. – vmonteco

+0

@vmonteco Sie könnten eine for-Schleife verwenden, um jeden Wert zuzuweisen. Nicht nur wird es einfacher zu lesen, es sollte einfacher zu verstehen sein. Aber das ist meine Meinung. – Jerrybibo

Verwandte Themen