Saya punya tupel tupel dari kueri MySQL seperti ini:
T1 = (('13', '17', '18', '21', '32'),
('07', '11', '13', '14', '28'),
('01', '05', '06', '08', '15', '16'))
Saya ingin mengubah semua elemen string menjadi bilangan bulat dan memasukkannya kembali ke daftar daftar:
T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]
Saya mencoba mencapainya eval
tetapi belum mendapatkan hasil yang layak.
Jawaban:
int()
adalah fungsi bawaan standar Python untuk mengubah string menjadi nilai integer. Anda menyebutnya dengan string yang berisi angka sebagai argumen, dan itu mengembalikan nomor yang dikonversi ke integer:Cetakan di atas
2
.Jika Anda mengetahui struktur daftar Anda, T1 (yang hanya berisi daftar, hanya satu tingkat), Anda bisa melakukan ini dengan Python 2:
Dengan Python 3:
sumber
T2 = map(lambda lol: map(int, lol), T1)
? Entah peta atau daftar pemahaman, keduanya konyol;)Anda dapat melakukan ini dengan pemahaman daftar:
Pemahaman daftar bagian dalam (
[int(column) for column in row]
) membangun alist
dariint
s dari urutanint
objek -able, seperti string desimal, dirow
. Pemahaman daftar luar ([... for row in T1])
) membangun daftar hasil pemahaman daftar dalam yang diterapkan untuk setiap item diT1
.Cuplikan kode akan gagal jika salah satu baris berisi objek yang tidak dapat dikonversi oleh
int
. Anda akan membutuhkan fungsi yang lebih cerdas jika Anda ingin memproses baris yang berisi string non-desimal.Jika Anda tahu struktur baris, Anda bisa mengganti pemahaman daftar dalam dengan panggilan ke fungsi baris. Misalnya.
sumber
Saya lebih suka menggunakan hanya daftar pemahaman:
sumber
Alih-alih menempatkan
int( )
, menempatkanfloat( )
yang akan memungkinkan Anda menggunakan desimal bersama dengan bilangan bulat.sumber
Saya setuju dengan jawaban everyones sejauh ini tetapi masalahnya adalah bahwa jika Anda tidak memiliki semua bilangan bulat, mereka akan macet.
Jika Anda ingin mengecualikan yang bukan bilangan bulat maka
Ini hanya menghasilkan digit aktual. Alasan saya tidak menggunakan pemahaman daftar langsung adalah karena pemahaman daftar bocor variabel internal mereka.
sumber
isdigit
itu rumit, cobalah-1
.int(<str>)
adalah cara untuk memeriksa dengantry
/except
.sumber
Coba ini.
x adalah string karena memiliki tanda kutip di sekitarnya, tetapi ia memiliki angka di dalamnya.
Karena x memiliki angka 1 di dalamnya, saya dapat mengubahnya menjadi bilangan bulat.
Untuk melihat apakah string adalah angka, Anda dapat melakukan ini.
Itu harus mencetak ke IDLE Benar karena x adalah angka.
Itu harus dicetak ke IDLE False karena y bukan angka.
sumber
x.isnumeric()
.Menggunakan pemahaman daftar:
sumber
Dalam Python 3.5.1 hal-hal seperti ini berfungsi:
dan
George.
sumber
Lihat fungsi ini
Kemudian
Anda juga bisa memeriksanya
sumber
eval
itu jahat: Anda harus menggantinya denganast.literal_eval
.Solusi fungsional lain untuk Python 2:
Python 3 akan sedikit berantakan:
kita bisa memperbaikinya dengan pembungkus
sumber
Jika itu hanya tupel tupel, sesuatu seperti
rows=[map(int, row) for row in rows]
akan melakukan trik. (Ada pemahaman daftar dan panggilan untuk memetakan (f, lst), yang sama dengan [f (a) untuk a in lst], di sana.)Eval bukan yang ingin Anda lakukan, kalau-kalau ada sesuatu seperti
__import__("os").unlink("importantsystemfile")
dalam database Anda karena beberapa alasan. Selalu memvalidasi input Anda (jika dengan tidak ada yang lain, int pengecualian () akan naik jika Anda memiliki input yang buruk).sumber
Anda dapat melakukan sesuatu seperti ini:
sumber
Saya ingin membagikan opsi yang tersedia yang sepertinya belum disebutkan di sini:
Akan menghasilkan permutasi acak array x. Tidak persis seperti yang Anda minta, tetapi ini merupakan solusi potensial untuk pertanyaan serupa.
sumber