Hier sind acht raffinierte Python-Tricks, die Sie sicher noch nicht gesehen haben. Wenden Sie diese Tricks auf Ihren Python-Code an, um ihn prägnanter und performanter zu gestalten!
1. Objekte nach mehreren Schlüsseln sortieren
Angenommen, wir möchten die folgende Liste von Wörterbüchern sortieren:
people = [
{ 'name': 'John', "age": 64 },
{ 'name': 'Janet', "age": 34 },
{ 'name': 'Ed', "age": 24 },
{ 'name': 'Sara', "age": 64 },
{ 'name': 'John', "age": 32 },
{ 'name': 'Jane', "age": 34 },
{ 'name': 'John', "age": 99 },
]
Wir wollen sie aber nicht nur nach Name oder Alter sortieren, sondern nach beiden Feldern. In SQL wäre dies eine Abfrage wie folgt:
SELECT * FROM people ORDER by name, age
Eigentlich ist es eine sehr einfache Lösung für dieses Problem, dank Pythons Garantie , dass die Sortierfunktionen sorgen für Stabilität Sortierung . Dies bedeutet, dass die verglichenen Elemente ihre ursprüngliche Reihenfolge beibehalten.
Um eine Sortierung nach Name und Alter zu erreichen, können wir Folgendes tun:
import operator
people.sort(key=operator.itemgetter('age'))
people.sort(key=operator.itemgetter('name'))
Beachten Sie, wie ich die Reihenfolge geändert habe. Sortieren Sie zuerst nach Alter und dann nach Namen. Mit erhalten
operator.itemgetter()
wir die Alters- und Namensfelder aus jedem Wörterbuch in der Liste.
Dies gibt uns das gewünschte Ergebnis:
[
{'name': 'Ed', 'age': 24},
{'name': 'Jane', 'age': 34},
{'name': 'Janet','age': 34},
{'name': 'John', 'age': 32},
{'name': 'John', 'age': 64},
{'name': 'John', 'age': 99},
{'name': 'Sara', 'age': 64}
]
Namen werden zuerst sortiert, Alter wird sortiert, wenn der Name übereinstimmt. Somit sind alle Jones nach Alter gruppiert.
Die Inspirationsquelle ist eine Frage von StackOverflow .
2. Listeneinschlüsse (Listengenerator)
Listeneinschlüsse können die hässlichen Schleifen ersetzen, die zum Auffüllen der Liste verwendet werden. Grundlegende Syntax für Listeneinschlüsse:
[ expression for item in list if conditional ]
Ein sehr einfaches Beispiel zum Füllen einer Liste mit einer Folge von Zahlen:
mylist = [i for i in range(10)]
print(mylist)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Und da Sie einen Ausdruck verwenden können, können Sie auch etwas rechnen:
squares = [x**2 for x in range(10)]
print(squares)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Oder rufen Sie sogar eine externe Funktion auf:
def some_function(a):
return (a + 5) / 2
my_formula = [some_function(i) for i in range(10)]
print(my_formula)
# [2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0]
Schließlich können Sie "if" verwenden, um die Liste zu filtern. In diesem Fall speichern wir nur die Werte, die durch 2 teilbar sind:
filtered = [i for i in range(20) if i%2==0]
print(filtered)
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
3. Überprüfen Sie die Speichernutzung Ihrer Objekte
Mit sys.getsizeof () können Sie die Speichernutzung eines Objekts überprüfen:
import sys
mylist = range(0, 10000)
print(sys.getsizeof(mylist))
# 48
Wow ... warte ... warum ist diese riesige Liste nur 48 Bytes?
Dies liegt daran, dass die Bereichsfunktion eine Klasse zurückgibt, die sich nur wie eine Liste verhält. Ein Bereich ist viel weniger speicherintensiv als eine tatsächliche Liste von Zahlen.
Sie können sich selbst davon überzeugen, indem Sie Listeneinschlüsse verwenden, um eine tatsächliche Liste von Zahlen aus demselben Bereich zu erstellen:
import sys
myreallist = [x for x in range(0, 10000)]
print(sys.getsizeof(myreallist))
# 87632
Wenn
sys.getsizeof()
Sie also herumspielen, können Sie mehr über Python und Ihre Speichernutzung erfahren.
4. Datenklassen
Seit Version 3.7 bietet Python Datenklassen an. Es gibt mehrere Vorteile gegenüber regulären Klassen oder anderen Alternativen, z. B. die Rückgabe mehrerer Werte oder Wörterbücher:
- Die Datenklasse erfordert nur eine minimale Menge an Code
- Sie können Datenklassen vergleichen, weil es gibt
__eq__
- Sie können leicht eine Datenklasse zum Debuggen ableiten, da es eine gibt
__repr__
- Datenklassen erfordern Bandhinweise, wodurch die Wahrscheinlichkeit von Fehlern verringert wird
Hier ist ein Beispiel für eine Datenklasse in Aktion:
from dataclasses import dataclass
@dataclass
class Card:
rank: str
suit: str
card = Card("Q", "hearts")
print(card == card)
# True
print(card.rank)
# 'Q'
print(card)
Card(rank='Q', suit='hearts')
Eine ausführliche Anleitung finden Sie hier .
5. Paketattrs
Sie können attrs anstelle von Datenklassen verwenden . Es gibt zwei Gründe zu wählen
attrs
:
- Sie verwenden eine Python-Version älter als 3.7
- Sie möchten mehr Optionen
Das Paket
attrs
unterstützt alle Hauptversionen von Python, einschließlich CPython 2.7 und PyPy. Einige der im attrs
Vergleich zu regulären Datenklassen angebotenen zusätzlichen Attribute sind Validatoren und Konverter. Schauen wir uns einen Beispielcode an:
@attrs
class Person(object):
name = attrib(default='John')
surname = attrib(default='Doe')
age = attrib(init=False)
p = Person()
print(p)
p = Person('Bill', 'Gates')
p.age = 60
print(p)
# Output:
# Person(name='John', surname='Doe', age=NOTHING)
# Person(name='Bill', surname='Gates', age=60)
Die Autoren
attrs
arbeiteten tatsächlich in dem PEP, das die Datenklassen einführte. Datenklassen werden bewusst einfacher gehalten (leichter zu verstehen), während attrs eine Reihe von Funktionen bietet, die Sie möglicherweise benötigen!
Weitere Beispiele finden Sie auf der Seite attrs-Beispiele .
6. Wörterbücher kombinieren (Python 3.5+)
Seit Python 3.5 ist es einfacher, Wörterbücher zu kombinieren:
dict1 = { 'a': 1, 'b': 2 }
dict2 = { 'b': 3, 'c': 4 }
merged = { **dict1, **dict2 }
print (merged)
# {'a': 1, 'b': 3, 'c': 4}
Bei überlappenden Schlüsseln werden die Schlüssel aus dem ersten Wörterbuch überschrieben.
In Python 3.9 wird das Kombinieren von Wörterbüchern noch sauberer. Die obige Zusammenführung in Python 3.9 kann wie folgt umgeschrieben werden:
merged = dict1 | dict2
7. Suchen Sie nach der häufigsten Bedeutung
So finden Sie den häufigsten Wert in einer Liste oder Zeichenfolge:
test = [1, 2, 3, 4, 2, 2, 3, 1, 4, 4, 4]
print(max(set(test), key = test.count))
# 4
Verstehst du warum das funktioniert? Versuchen Sie es selbst herauszufinden, bevor Sie weiterlesen.
Du hast es sogar versucht, oder? Ich werde es dir trotzdem sagen:
max()
gibt den größten Wert in der Liste zurück. Das Argument verwendetkey
eine einzelne Argumentfunktion, um die Sortierreihenfolge festzulegen, in diesem Fall test.count. Die Funktion wird auf jedes Element der Iterable angewendet.test.count
- eingebaute Listenfunktion. Es nimmt ein Argument an und zählt die Anzahl der Vorkommen für dieses Argument. Estest.count(1)
wird also 2 undtest.count(4)
4 zurückgegeben.set(test)
Gibt alle eindeutigen Werte aus dem Test zurück, also {1, 2, 3, 4}
In dieser einzelnen Codezeile akzeptieren wir also alle eindeutigen Werte für einen Test
{1, 2, 3, 4}
. Als nächstes wird max
eine Funktion auf sie angewendet list.count
und der Maximalwert zurückgegeben.
Und nein - ich habe diesen Einzeiler nicht erfunden.
Update: Eine Reihe von Kommentatoren hat zu Recht festgestellt, dass es einen viel effizienteren Weg gibt, dies zu tun:
from collections import Counter
Counter(test).most_common(1)
# [4: 4]
8. Mehrere Werte zurückgeben
Funktionen in Python können mehr als eine Variable ohne Wörterbuch, Liste oder Klasse zurückgeben. Es funktioniert so:
def get_user(id):
# fetch user from database
# ....
return name, birthdate
name, birthdate = get_user(4)
Dies ist normal für eine begrenzte Anzahl von Rückgabewerten. Aber alles, was 3 Werte überschreitet, sollte in die (Daten-) Klasse eingeordnet werden.
In den kostenpflichtigen Online-Kursen von SkillFactory erfahren Sie, wie Sie einen hochkarätigen Beruf von Grund auf neu aufbauen oder Ihre Fähigkeiten und Ihr Gehalt verbessern können:
- Machine Learning (12 )
- Data Science (12 )
- (9 )
- «Python -» (9 )