Wie kann ich das Listenverständnis verwenden, um aus einer Liste ein Tupel mit 2 Tupeln zu erstellen? Es wäre gleichbedeutend mit
tup = ()
for element in alist:
tup = tup + ((element.foo, element.bar),)
tup = tuple((element.foo, element.bar) for element in alist)
Technisch gesehen ist es ein Generatorausdruck . Es ist wie ein Listenverständnis, wird jedoch träge ausgewertet und muss keinen Speicher für eine Zwischenliste zuweisen.
Der Vollständigkeit halber würde das Listenverständnis folgendermaßen aussehen:
tup = tuple([(element.foo, element.bar) for element in alist])
PS: attrgetter
ist nicht schneller ( alist
hat eine Million Artikel hier):
In [37]: %timeit tuple([(element.foo, element.bar) for element in alist])
1 loops, best of 3: 165 ms per loop
In [38]: %timeit tuple((element.foo, element.bar) for element in alist)
10 loops, best of 3: 155 ms per loop
In [39]: %timeit tuple(map(operator.attrgetter('foo','bar'), alist))
1 loops, best of 3: 283 ms per loop
In [40]: getter = operator.attrgetter('foo','bar')
In [41]: %timeit tuple(map(getter, alist))
1 loops, best of 3: 284 ms per loop
In [46]: %timeit tuple(imap(getter, alist))
1 loops, best of 3: 264 ms per loop
tuple(map(operator.attrgetter('foo','bar'),alist))
. Ich würde wahrscheinlich die von Ihnen veröffentlichte zur besseren Lesbarkeit verwenden,attrgetter
könnte aber einen leichten Leistungsvorteil haben. Sie müsstentimeit
und sehen, ob dies in einer wirklich engen Schleife ist.Sie können den folgenden Ausdruck verwenden
tup = *[(element.foo, element.bar) for element in alist]
Dies generiert zuerst eine Liste von Tupeln und konvertiert dann diese Liste von Tupeln in ein Tupel von Tupeln.
quelle