Saya memiliki daftar Python berikut (juga bisa menjadi tupel):
myList = ['foo', 'bar', 'baz', 'quux']
Bisa saya katakan
>>> myList[0:3]
['foo', 'bar', 'baz']
>>> myList[::2]
['foo', 'baz']
>>> myList[1::2]
['bar', 'quux']
Bagaimana saya secara eksplisit memilih item yang indeksnya tidak memiliki pola tertentu? Misalnya, saya ingin memilih [0,2,3]
. Atau dari daftar 1000 item yang sangat besar, saya ingin memilih [87, 342, 217, 998, 500]
. Apakah ada sintaks Python yang melakukan itu? Sesuatu yang terlihat seperti:
>>> myBigList[87, 342, 217, 998, 500]
Jawaban:
Saya membandingkan jawaban dengan python 2.5.2:
19.7 usec:
[ myBigList[i] for i in [87, 342, 217, 998, 500] ]
20.6 usec:
map(myBigList.__getitem__, (87, 342, 217, 998, 500))
22.7 usec:
itemgetter(87, 342, 217, 998, 500)(myBigList)
24.6 usec:
list( myBigList[i] for i in [87, 342, 217, 998, 500] )
Perhatikan bahwa di Python 3, yang pertama diubah menjadi sama dengan yang ke-4.
Pilihan lain adalah memulai dengan
numpy.array
yang memungkinkan pengindeksan melalui daftar ataunumpy.array
:Cara
tuple
kerjanya tidak sama seperti irisan.sumber
[myBigList[i] for i in [87, 342, 217, 998, 500]]
, tapi saya suka pendekatan ini yang terbaik.from operator import itemgetter
di bagian inisialisasipython -mtimeit
.myBigList[(87, 342, 217, 998, 500)]
tidak berfungsi ketikamyBigList
python biasalist
? Ketika saya mencoba itu saya dapatkanTypeError: list indices must be integers or slices, not tuple
. Itu akan jauh lebih mudah daripada mengetikkan pemahaman - apakah ada masalah desain / implementasi bahasa yang terlibat?lists
di Python hanya menerima integer atau irisan. Meneruskan integer memastikan bahwa hanya satu item yang diambil dari daftar yang ada. Meneruskan slice memastikan sebagian darinya diambil, tetapi meneruskan tupel seperti meneruskan tipe data (tuple
) sebagai argumen ke tipe data lain (list
) yang secara sintaksis salah.Bagaimana dengan ini:
sumber
operator
modul itu!Ini bukan bawaan, tetapi Anda dapat membuat subkelas dari daftar yang menggunakan tupel sebagai "indeks" jika Anda ingin:
pencetakan
sumber
Mungkin pemahaman daftar sesuai:
Menghasilkan:
Itukah yang kamu cari?
sumber
Anda juga dapat membuat
List
kelas Anda sendiri yang mendukung tupel sebagai argumen__getitem__
jika Anda ingin melakukannyamyList[(2,2,1,3)]
.sumber
operator
.len(myList)
lebihmyList.__len__()
.Saya hanya ingin menunjukkan, bahkan sintaks itemgetter terlihat sangat rapi, tetapi agak lambat ketika tampil di daftar besar.
Itemgetter mengambil 1.065209062149279
Irisan ganda mengambil 0,6225321444745759
sumber
myList = np.array(range(1000000))
jika tidak Anda akan mendapatkan kesalahan.Solusi lain yang mungkin:
sumber
seperti sering kali jika Anda memiliki array numpy boolean seperti
mask
[mylist[i] for i in np.arange(len(mask), dtype=int)[mask]]
Lambda yang berfungsi untuk semua urutan atau np.array:
subseq = lambda myseq, mask : [myseq[i] for i in np.arange(len(mask), dtype=int)[mask]]
newseq = subseq(myseq, mask)
sumber