Saya memiliki string yang dimulai dengan angka (dari 0-9) Saya tahu saya bisa "atau" 10 kasus uji menggunakan startswith () tetapi mungkin ada solusi yang lebih rapi
jadi bukannya menulis
if (string.startswith('0') || string.startswith('2') ||
string.startswith('3') || string.startswith('4') ||
string.startswith('5') || string.startswith('6') ||
string.startswith('7') || string.startswith('8') ||
string.startswith('9')):
#do something
Apakah ada cara yang lebih pintar / lebih efisien?
string.startswith('1')
.s[0]
ataus[:1]
tapi solusi dari John Machin:if s.startswith(tuple('0123456789'))
. Selain itu, solusi ini menimbulkan kesalahan ketika terjadi bahwa s adalah urutan seperti tupel atau daftar, yang menghasilkan hasil yang sama seperti jika itu adalah string. - Solusi lain adalah regex yang polanya '\ d (? = \ D)' tetapi penggunaan regex berlebihan di sini.string
adalah modul di pustaka standar dan mungkin tidak boleh digunakan sebagai nama variabel. docs.python.org/2/library/string.htmlJawaban:
string
Perpustakaan Python memilikiisdigit()
metode:string[0].isdigit()
sumber
string
Modul Python2 tidak memiliki metode, danisdigit
merupakan metodestr
danunicode
objek.string[:1].isdigit()
>>> string = '1abc' >>> string[0].isdigit() True
sumber
string[0]
?string[:1].isdigit()
, yang akan berhenti dengan senang hati berurusan dengan string kosong.terkadang, Anda dapat menggunakan regex
>>> import re >>> re.search('^\s*[0-9]',"0abc") <_sre.SRE_Match object at 0xb7722fa8>
sumber
Kode Anda tidak akan berfungsi; yang Anda butuhkan,
or
bukan||
.Mencoba
'0' <= strg[:1] <= '9'
atau
strg[:1] in '0123456789'
atau, jika Anda benar-benar tergila-gila
startswith
,strg.startswith(('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'))
sumber
strg[:1]
memiliki dua ketidaknyamanan: mereka tidak memunculkan kesalahan jika s mungkin merupakan daftar string, dan mereka menghasilkan True jika string dimulai dengan BEBERAPA digit.startswith
dan melakukan menerapkannya dengan cara ini dalam kode saya. Terima kasih.startswith(tuple(str(i) for i in range(10)))
Potongan kode ini:
for s in ("fukushima", "123 is a number", ""): print s.ljust(20), s[0].isdigit() if s else False
mencetak berikut ini:
fukushima False 123 is a number True False
sumber
s[:1].isdigit()
ataus and s[0].isdigit()
s and s[0].isdigit()
bahkan kurang terbaca menurut saya. Secara pribadi, saya suka konstruksinya ... jika ... lain ... Mempertimbangkan komentar Anda, saya hanya akan memperbaikinya seperti itu:s[0].isdigit() if s!="" else False
Mengejutkan bahwa setelah sekian lama masih ada jawaban terbaik yang hilang.
Kelemahan dari jawaban lain digunakan
[0]
untuk memilih karakter pertama, tetapi seperti yang dicatat, ini putus pada string kosong.Menggunakan cara berikut mengatasi masalah ini, dan, menurut pendapat saya, memberikan sintaks yang tercantik dan paling mudah dibaca dari opsi yang kita miliki. Itu juga tidak mengimpor / mengganggu regex):
>>> string = '1abc' >>> string[:1].isdigit() True >>> string = '' >>> string[:1].isdigit() False
sumber
Anda juga bisa menggunakan
try...except
:try: int(string[0]) # do your stuff except: pass # or do your stuff
sumber
Ini adalah "jawaban" saya (mencoba menjadi unik di sini, saya sebenarnya tidak merekomendasikan keduanya untuk kasus khusus ini :-)
Menggunakan
ord () dana <= b <= c
bentuk khusus ://starts_with_digit = ord('0') <= ord(mystring[0]) <= ord('9') //I was thinking too much in C. Strings are perfectly comparable. starts_with_digit = '0' <= mystring[0] <= '9'
(Ini
a <= b <= c
, sepertia < b < c
, adalah konstruksi Python khusus dan cukup rapi: bandingkan1 < 2 < 3
(true) dan1 < 3 < 2
(false) dan(1 < 3) < 2
(true). Ini bukan cara kerjanya di sebagian besar bahasa lain.)Menggunakan ekspresi reguler :
import re //starts_with_digit = re.match(r"^\d", mystring) is not None //re.match is already anchored starts_with_digit = re.match(r"\d", mystring) is not None
sumber
ord()
(2) Kalah^
di regex.Anda bisa menggunakan ekspresi reguler .
Anda dapat mendeteksi digit menggunakan:
if(re.search([0-9], yourstring[:1])): #do something
Par [0-9] cocok dengan digit apa pun, dan string [: 1] cocok dengan karakter pertama string Anda
sumber
Gunakan Ekspresi Reguler , jika Anda ingin memperluas fungsionalitas metode.
sumber
Coba ini:
if string[0] in range(10):
sumber
range(10)
menghasilkan daftar bilangan bulat, sedangkanstring[0]
adalah string dengan panjang 1.if string[0] in map(str,range(10))
bekerja