Sie können es die mit zip
und reduce
tun built-in Funktionen (und in Python3 functools.reduce
):
>>> list_of_servers=[server1,server2,server3]
>>> s=reduce(lambda x,y:x+y,zip(*list_of_servers))
>>> s
('a', 'd', 'g', 'b', 'e', 'h', 'c', 'f', 'i')
Oder statt reduce()
für lange Listen Sie itertools.chain
verwenden können, um die Unterlisten zu verketten, die einen Generator zurück:
>>> list(chain(*zip(*[server1,server2,server3])))
['a', 'd', 'g', 'b', 'e', 'h', 'c', 'f', 'i']
HINWEIS, dass, wenn Sie Ihr Ergebnis iterieren wollen Sie don‘ t müssen list
auf das Ergebnis chain
verwenden. Sie können nur so etwas wie:
for element in chain(*zip(*[server1,server2,server3])):
#do stuff
Benchmarking auf den vorhergehenden Rezepte:
#reduce()
:~$ python -m timeit "server1 = ['a','b','c'];server2 = ['d','e','f'];server3 = ['g','h','i'];reduce(lambda x,y:x+y,zip(*[server1,server2,server3]))"
1000000 loops, best of 3: 1.11 usec per loop
#itertools.chain()
:~$ python -m timeit "server1 = ['a','b','c'];server2 = ['d','e','f'];server3 = ['g','h','i'];from itertools import chain;chain(*zip(*[server1,server2,server3]))"
100000 loops, best of 3: 2.02 usec per loop
Beachten Sie, dass, wenn Sie nicht die Server innerhalb einer Liste setzen Sie wäre es schneller:
:~$ python -m timeit "server1 = ['a','b','c'];server2 = ['d','e','f'];server3 = ['g','h','i'];reduce(lambda x,y:x+y,zip(server1,server2,server3))"
1000000 loops, best of 3: 0.98 usec per loop
Wenn Sie Listen mit unquel Länge haben, sehen Sie sich die Lösung von @ Anonymous an (http: // stackoverflow.com/a/29226491/4687645). Es ist wesentlich schneller, wenn der Unterschied in den Listenlängen groß ist. – Matt