Apa cara tercepat dan paling elegan untuk melakukan daftar daftar dari dua daftar?
saya sudah
In [1]: a=[1,2,3,4,5,6]
In [2]: b=[7,8,9,10,11,12]
In [3]: zip(a,b)
Out[3]: [(1, 7), (2, 8), (3, 9), (4, 10), (5, 11), (6, 12)]
Dan saya ingin memilikinya
In [3]: some_method(a,b)
Out[3]: [[1, 7], [2, 8], [3, 9], [4, 10], [5, 11], [6, 12]]
Saya sedang berpikir untuk menggunakan peta daripada zip, tapi saya tidak tahu apakah ada beberapa metode perpustakaan standar untuk dimasukkan sebagai argumen pertama.
Saya dapat mendefinisikan fungsi saya sendiri untuk ini, dan menggunakan peta, pertanyaan saya adalah apakah sudah ada yang diterapkan. Tidak juga merupakan jawaban.
Jawaban:
Jika Anda membuat zip lebih dari 2 daftar (atau bahkan hanya 2, dalam hal ini), cara yang dapat dibaca adalah:
[list(a) for a in zip([1,2,3], [4,5,6], [7,8,9])]
Ini menggunakan pemahaman daftar dan mengubah setiap elemen dalam daftar (tupel) menjadi daftar.
sumber
Anda sendiri hampir mendapatkan jawabannya. Jangan gunakan
map
sebagai gantinyazip
. Gunakanmap
DANzip
.Anda dapat menggunakan peta bersama dengan zip untuk pendekatan yang elegan dan fungsional:
zip
mengembalikan daftar tupel.map(list, [...])
panggilanlist
pada setiap tupel dalam daftar.list(map([...])
mengubah objek peta menjadi daftar yang dapat dibaca.sumber
generator
membebankan biaya gandalist
di sini.Saya suka keanggunan fungsi zip, tetapi menggunakan fungsi itemgetter () di modul operator tampaknya jauh lebih cepat. Saya menulis skrip sederhana untuk menguji ini:
import time from operator import itemgetter list1 = list() list2 = list() origlist = list() for i in range (1,5000000): t = (i, 2*i) origlist.append(t) print "Using zip" starttime = time.time() list1, list2 = map(list, zip(*origlist)) elapsed = time.time()-starttime print elapsed print "Using itemgetter" starttime = time.time() list1 = map(itemgetter(0),origlist) list2 = map(itemgetter(1),origlist) elapsed = time.time()-starttime print elapsed
Saya berharap zip menjadi lebih cepat, tetapi metode itemgetter menang jauh:
Using zip 6.1550450325 Using itemgetter 0.768098831177
sumber
zip
membuat daftar nyata. Itu memperlambat segalanya. Coba gantizip
denganitertools.izip
itu.list1 = [x[0] for x in origlist]
berfungsi dengan baiklist1 = map(itemgetter(0), origlist)
.Saya biasanya tidak suka menggunakan lambda, tapi ...
>>> a = [1, 2, 3, 4, 5] >>> b = [6, 7, 8, 9, 10] >>> c = lambda a, b: [list(c) for c in zip(a, b)] >>> c(a, b) [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]
Jika Anda membutuhkan kecepatan ekstra, petakan sedikit lebih cepat:
>>> d = lambda a, b: map(list, zip(a, b)) >>> d(a, b) [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]
Namun, map dianggap unpythonic dan hanya boleh digunakan untuk penyetelan performa.
sumber
lambda
ditambahkan di sini? Seseorang bisa saja menulis ekspresi alih-alih memanggil suatu fungsi (sebenarnya tidak rumit), dan bahkan jika seseorang menginginkan fungsi untuknya, itu dapat didefinisikan tanpa rasa sakit dalam dua baris (satu jika kunci kembali Anda rusak atau Anda gila) .map
di sisi lain baik-baik saja jika argumen pertama akan menjadi fungsi biasa (sebagai lawan alambda
).map
lebihlambda
. jadimap(list, zip(a,b))
. Pemahaman daftar mungkin sedikit lebih jelas, tetapi peta harus lebih cepat (belum teruji)Bagaimana dengan ini?
>>> def list_(*args): return list(args) >>> map(list_, range(5), range(9,4,-1)) [[0, 9], [1, 8], [2, 7], [3, 6], [4, 5]]
Atau bahkan lebih baik:
>>> def zip_(*args): return map(list_, *args) >>> zip_(range(5), range(9,4,-1)) [[0, 9], [1, 8], [2, 7], [3, 6], [4, 5]]
sumber
Menggunakan numpy
Definisi keanggunan bisa sangat dipertanyakan tetapi jika Anda bekerja dengan
numpy
pembuatan array dan konversinya ke daftar (jika diperlukan ...) bisa sangat praktis meskipun tidak begitu efisien dibandingkan menggunakanmap
fungsi atau pemahaman daftar.import numpy as np a = b = range(10) zipped = zip(a,b) result = np.array(zipped).tolist() Out: [[0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6], [7, 7], [8, 8], [9, 9]]
Jika tidak, lewati
zip
fungsi yang dapat Anda gunakan secara langsungnp.dstack
:np.dstack((a,b))[0].tolist()
sumber
Pemahaman daftar akan menjadi solusi yang sangat sederhana.
a=[1,2,3,4,5,6] b=[7,8,9,10,11,12] x = [[i, j] for i, j in zip(a,b)] print(x) output : [[1, 7], [2, 8], [3, 9], [4, 10], [5, 11], [6, 12]]
sumber