Saya memiliki sebuah tuple dari tuple dari sebuah query MySQL seperti ini:
T1 = (('13', '17', '18', '21', '32'),
('07', '11', '13', '14', '28'),
('01', '05', '06', '08', '15', '16'))
I'd seperti untuk mengkonversi semua string elemen ke bilangan bulat dan menempatkan mereka kembali ke daftar list:
T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]
Saya mencoba untuk mencapai dengan eval
tetapi didn't mendapatkan hasil yang layak belum.
int()
adalah Python standar built-in fungsi untuk mengkonversi string menjadi nilai integer. Anda menyebutnya dengan string yang berisi nomor sebagai argumen dan mengembalikan sejumlah dikonversi ke integer:
print (int("1") + 1)
Di atas cetakan 2
.
Jika anda mengetahui struktur dari daftar anda, T1 (yang hanya berisi daftar, hanya satu tingkat), anda bisa melakukan hal ini di Python versi 2:
T2 = [map(int, x) for x in T1]
Di Python 3:
T2 = [list(map(int, x)) for x in T1]
Anda dapat melakukan ini dengan daftar pemahaman:
T2 = [[int(column) for column in row] for row in T1]
Dalam daftar pemahaman ([int(kolom) untuk kolom pada baris]
) membangun sebuah daftar
dari int dari urutan
int-bisa benda-benda, seperti desimal string, di
row. Luar daftar pemahaman (
[... untuk baris di T1])) membangun daftar hasil dalam daftar pemahaman diterapkan untuk masing-masing item dalam
T1`.
Cuplikan kode akan gagal jika salah satu baris yang berisi benda-benda yang dapat't diubah oleh int
. Anda'll perlu lebih cerdas fungsi jika anda ingin proses baris yang mengandung non-desimal string.
Jika anda tahu struktur baris, anda dapat mengganti batin daftar pemahaman dengan panggilan ke fungsi-turut. Misalnya.
T2 = [parse_a_row_of_T1(row) for row in T1]
Saya setuju dengan everyones jawaban sejauh ini tapi masalahnya adalah bahwa jika anda tidak memiliki semua bilangan bulat mereka akan crash.
Jika anda ingin mengecualikan non-bilangan bulat maka
T1 = (('13', '17', '18', '21', '32'),
('07', '11', '13', '14', '28'),
('01', '05', '06', '08', '15', '16'))
new_list = list(list(int(a) for a in b) for b in T1 if a.isdigit())
Ini sebenarnya hanya menghasilkan angka. Alasan saya don't menggunakan langsung daftar pemahaman ini karena daftar pemahaman kebocoran internal mereka variabel.
Mencoba ini.
x = "1"
x adalah string karena memiliki tanda kutip itu, tetapi memiliki nomor di dalamnya.
x = int(x)
Sejak x memiliki nomor 1 dalam hal ini, saya dapat mengubahnya ke sebuah integer.
Untuk melihat apakah sebuah string angka, anda bisa melakukan hal ini.
def is_number(var):
try:
if var == int(var):
return True
except Exception:
return False
x = "1"
y = "test"
x_test = is_number(x)
print(x_test)
Itu harus cetak untuk MENGANGGUR Benar karena x adalah nomor.
y_test = is_number(y)
print(y_test)
Itu harus cetak untuk MENGANGGUR Palsu karena y dalam bentuk bukan angka.
Satu lagi solusi fungsional untuk Python versi 2:
from functools import partial
map(partial(map, int), T1)
Python 3 akan menjadi sedikit berantakan meskipun:
list(map(list, map(partial(map, int), T1)))
kami dapat memperbaiki hal ini dengan pembungkus
def oldmap(f, iterable):
return list(map(f, iterable))
oldmap(partial(oldmap, int), T1)
Melihat fungsi ini
def parse_int(s):
try:
res = int(eval(str(s)))
if type(res) == int:
return res
except:
return
Kemudian
val = parse_int('10') # Return 10
val = parse_int('0') # Return 0
val = parse_int('10.5') # Return 10
val = parse_int('0.0') # Return 0
val = parse_int('Ten') # Return None
Anda juga dapat memeriksa
if val == None: # True if input value can not be converted
pass # Note: Don't use 'if not val:'
Jika itu's hanya tuple dari tuples, sesuatu seperti rows=[peta(int, baris) untuk turut dalam baris]
akan melakukan trik. (Ada's daftar pemahaman dan panggilan untuk peta(f, lst), yang sama dengan [f(a) untuk a dalam lst], di sana.)
Eval adalah not apa yang ingin anda lakukan, dalam kasus ada's sesuatu seperti __import__("os").unlink("importantsystemfile")
di database anda untuk beberapa alasan.
Selalu memvalidasi masukan anda (jika dengan apa-apa lagi, kecuali int() akan meningkatkan jika anda memiliki masukan buruk).
Saya ingin berbagi pilihan yang tersedia yang doesn't tampaknya akan disebutkan di sini:
rumpy.random.permutation(x)
Akan menghasilkan permutasi acak dari array x. Tidak tepat apa yang anda minta, tapi itu adalah solusi potensial untuk pertanyaan-pertanyaan serupa.
Anda dapat melakukan sesuatu seperti ini:
T1 = (('13', '17', '18', '21', '32'),
('07', '11', '13', '14', '28'),
('01', '05', '06', '08', '15', '16'))
new_list = list(list(int(a) for a in b if a.isdigit()) for b in T1)
print(new_list)