Saya memiliki daftar seperti di bawah ini di mana elemen pertama adalah id dan yang lainnya adalah string:
[(1, u'abc'), (2, u'def')]
Saya ingin membuat daftar id hanya dari daftar tupel seperti di bawah ini:
[1,2]
Saya akan menggunakan daftar ini __in
sehingga perlu daftar nilai integer.
maksud Anda sesuatu seperti ini
Apa yang sebenarnya Anda miliki adalah daftar
tuple
objek, bukan daftar set (seperti pertanyaan awal Anda tersirat). Jika itu sebenarnya adalah daftar set, maka tidak ada elemen pertama karena set tidak memiliki urutan.Di sini saya telah membuat daftar datar karena umumnya yang tampaknya lebih bermanfaat daripada membuat daftar 1 elemen tuple. Namun, Anda dapat dengan mudah membuat daftar 1 tupel elemen dengan hanya mengganti
seq[0]
dengan(seq[0],)
.sumber
int() argument must be a string or a number, not 'QuerySet'
int()
tidak ada dalam solusi saya, jadi pengecualian yang Anda lihat harus datang kemudian dalam kode.__in
untuk memfilter data__in
? - Berdasarkan contoh input yang Anda berikan, ini akan membuat daftar bilangan bulat. Namun, jika daftar tupel Anda tidak dimulai dengan bilangan bulat, maka Anda tidak akan mendapatkan bilangan bulat dan Anda harus membuatnya bilangan bulatint
, atau mencoba mencari tahu mengapa elemen pertama Anda tidak dapat dikonversi menjadi bilangan bulat.new_list = [ seq[0] for seq in yourlist if type(seq[0]) == int]
bekerja?Anda dapat menggunakan "tuple unpacking":
Pada waktu iterasi setiap tuple dibongkar dan nilainya diatur ke variabel
idx
danval
.sumber
Ini untuk apa
operator.itemgetter
.The
itemgetter
pernyataan mengembalikan fungsi yang mengembalikan indeks dari elemen yang Anda tentukan. Persis sama dengan menulisTetapi saya menemukan bahwa
itemgetter
itu lebih jelas dan lebih eksplisit .Ini berguna untuk membuat pernyataan sortir yang ringkas. Sebagai contoh,
sumber
Dari sudut pandang kinerja, di python3.X
[i[0] for i in a]
danlist(zip(*a))[0]
setaralist(map(operator.itemgetter(0), a))
Kode
keluaran
3.491014136001468e-05
3.422205176000717e-05
sumber
jika tupelnya unik maka ini bisa berhasil
sumber
ordereddict
.ketika saya berlari (seperti yang disarankan di atas):
alih-alih kembali:
Saya menerima ini sebagai pengembalian:
Saya menemukan saya harus menggunakan daftar ():
untuk berhasil mengembalikan daftar menggunakan saran ini. Yang mengatakan, saya senang dengan solusi ini, terima kasih. (diuji / jalankan menggunakan Spyder, konsol iPython, Python v3.6)
sumber
Saya berpikir bahwa mungkin berguna untuk membandingkan runtime dari pendekatan yang berbeda jadi saya membuat patokan (menggunakan perpustakaan simple_benchmark )
I) Benchmark memiliki tupel dengan 2 elemen
Seperti yang mungkin Anda harapkan untuk memilih elemen pertama dari tuple dengan indeks
0
menunjukkan menjadi solusi tercepat yang sangat dekat dengan solusi membongkar dengan mengharapkan tepat 2 nilaiII) Benchmark memiliki tupel dengan 2 elemen atau lebih
sumber
Itu adalah tupel, bukan set. Kamu bisa melakukan ini:
sumber
Anda dapat membuka paket tupel dan hanya mendapatkan elemen pertama menggunakan pemahaman daftar:
keluaran:
ini akan berfungsi tidak peduli berapa banyak elemen yang Anda miliki dalam sebuah tuple:
keluaran:
sumber
Saya bertanya-tanya mengapa tidak ada yang menyarankan untuk menggunakan numpy, tetapi sekarang setelah memeriksa saya mengerti. Ini mungkin bukan yang terbaik untuk array tipe campuran.
Ini akan menjadi solusi di numpy:
sumber