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),)
Antworten:
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: attrgetterist nicht schneller ( alisthat 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, attrgetterkönnte aber einen leichten Leistungsvorteil haben. Sie müssten timeitund sehen, ob dies in einer wirklich engen Schleife ist.