Ändern von Werten einer Liste von namedtuples

Ich habe eine Liste von namedtuples namens Books und versuche, das Preisfeld um 20% zu erhöhen, was den Wert von Books ändert. Ich habe versucht zu tun:

 from collections import namedtuple Book = namedtuple('Book', 'author title genre year price instock') BSI = [ Book('Suzane Collins','The Hunger Games', 'Fiction', 2008, 6.96, 20), Book('JK Rowling', "Harry Potter and the Sorcerer's Stone", 'Fantasy', 1997, 4.78, 12)] for item in BSI: item = item.price*1.10 print(item.price) 

Aber ich bekomme immer:

  Traceback (most recent call last): print(item.price) AttributeError: 'float' object has no attribute 'price' 

Ich verstehe, dass ich die Felder nicht in einem namedtuple setzen kann. Wie gehe ich über die Aktualisierung des price ?

Ich habe versucht, es zu einer Funktion zu machen:

 def restaurant_change_price(rest, newprice): rest.price = rest._replace(price = rest.price + newprice) return rest.price print(restaurant_change_price(Restaurant("Taillevent", "French", "343-3434", "Escargots", 24.50), 25)) 

Aber ich bekomme einen Fehler mit ersetzen sagen:

  rest.price = rest._replace(price = rest.price + newprice) AttributeError: can't set attribute 

Kann mir jemand mitteilen, warum das passiert?

2 Solutions collect form web for “Ändern von Werten einer Liste von namedtuples”

Benannte Tupel sind unveränderlich , so dass man sie nicht manipulieren kann.

Richtige Art, es zu tun:

Wenn Sie etwas veränderliches wollen, können Sie den recordtype .

 from recordtype import recordtype Book = recordtype('Book', 'author title genre year price instock') books = [ Book('Suzane Collins','The Hunger Games', 'Fiction', 2008, 6.96, 20), Book('JK Rowling', "Harry Potter and the Sorcerer's Stone", 'Fantasy', 1997, 4.78, 12)] for book in books: book.price *= 1.1 print(book.price) 

PS: Möglicherweise müssen Sie pip install recordtype wenn Sie es nicht installiert haben.

Schlechte Weg, es zu tun:

Sie können auch mit namedtuple mit der Methode _replace() verwenden.

 from collections import namedtuple Book = namedtuple('Book', 'author title genre year price instock') books = [ Book('Suzane Collins','The Hunger Games', 'Fiction', 2008, 6.96, 20), Book('JK Rowling', "Harry Potter and the Sorcerer's Stone", 'Fantasy', 1997, 4.78, 12)] for i in range(len(books)): books[i] = books[i]._replace(price = books[i].price*1.1) print(books[i].price) 

Das sieht aus wie eine Aufgabe für Pythons Datenanalyse Bibliothek, Pandas . Es ist wirklich sehr einfach, so etwas zu tun:

 In [6]: import pandas as pd In [7]: df = pd.DataFrame(BSI, columns=Book._fields) In [8]: df Out[8]: author title genre year \ 0 Suzane Collins The Hunger Games Fiction 2008 1 JK Rowling Harry Potter and the Sorcerers Stone Fantasy 1997 price instock 0 6.96 20 1 4.78 12 In [9]: df['price'] *= 100 In [10]: df Out[10]: author title genre year \ 0 Suzane Collins The Hunger Games Fiction 2008 1 JK Rowling Harry Potter and the Sorcerer's Stone Fantasy 1997 price instock 0 696 20 1 478 12 

Jetzt ist das nicht viel, viel besser als das namedtuple mit namedtuple s?

  • Konvertieren Sie die Liste der Tupel zu mehreren Listen in Python
  • Pythonistischen Weg, um Elemente der Listen gleichzeitig zu schneiden und hinzuzufügen
  • Einfügen eines Elements in ein Tupel
  • Zeitkomplexität von Gusslisten zu Tupeln in Python und umgekehrt
  • Python, Convert 9 Tupel UTC Datum auf MySQL datetime Format
  • Warum ist '() ist ()' return True wenn '[] ist []' und '{} ist {}' return False?
  • Python: Tupel / Wörterbücher als Schlüssel, auswählen, sortieren
  • Mutate Tupel von Listen, die "'Tupel' Objekt nicht unterstützt Item Zuweisung" [Duplizieren]
  • Zählen Sie, wie oft ein Teil eines Schlüssels in einem Wörterbuch python erscheint
  • Mehr pythonische Art, einen JSON-String aus einer Liste von Tupeln zu formatieren
  • Warum kann ich keine Liste als Dict-Key in Python verwenden?
  • Python ist die beste Programmiersprache der Welt.