Ich habe eine Zeichenfolge, die mit einer Zahl (von 0 bis 9) beginnt. Ich weiß, dass ich mit startwith () 10 Testfälle "oder" ausführen kann, aber es gibt wahrscheinlich eine bessere Lösung
also anstatt zu schreiben
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
Gibt es einen klügeren / effizienteren Weg?
string.startswith('1')
.s[0]
oders[:1]
aber die Lösung von John Machin:if s.startswith(tuple('0123456789'))
. Darüber hinaus löst diese Lösung einen Fehler aus, wenn s eine Sequenz wie ein Tupel oder eine Liste ist. In diesen Fällen wird das gleiche Ergebnis erzielt, als wäre es eine Zeichenfolge. - Eine andere Lösung ist ein Regex, dessen Muster '\ d (? = \ D)' ist, aber die Verwendung von Regex ist hier überflüssig.string
ist ein Modul in der Standardbibliothek und sollte wahrscheinlich nicht als Variablenname verwendet werden. docs.python.org/2/library/string.htmlAntworten:
Pythons
string
Bibliothek hat folgendeisdigit()
Methode:quelle
string
Modul verfügt nicht über Methoden undisdigit
ist eine Methode vonstr
undunicode
Objekten.string[:1].isdigit()
quelle
string[0]
?string[:1].isdigit()
, mit einem leeren String glücklich umzugehen.Manchmal können Sie Regex verwenden
quelle
Ihr Code funktioniert nicht. du brauchst
or
statt||
.Versuchen
oder
oder, wenn Sie wirklich verrückt sind
startswith
,quelle
strg[:1]
haben jedoch zwei Unannehmlichkeiten: Sie lösen keinen Fehler aus, wenn s eine Liste von Zeichenfolgen ist, und sie erzeugen True, wenn die Zeichenfolge mit mehreren Ziffern beginnt.startswith
und habe es so in meinen Code implementiert. Danke dir.startswith(tuple(str(i) for i in range(10)))
Dieser Code:
druckt folgendes aus:
quelle
s[:1].isdigit()
oders and s[0].isdigit()
s and s[0].isdigit()
ist meiner Meinung nach noch weniger lesbar. Persönlich mag ich das Konstrukt ... wenn ... sonst ... Unter Berücksichtigung Ihrer Bemerkung würde ich es einfach so verbessern:s[0].isdigit() if s!="" else False
Überraschend, dass nach so langer Zeit immer noch die beste Antwort fehlt.
Der Nachteil der anderen Antworten ist die
[0]
Auswahl des ersten Zeichens. Wie bereits erwähnt, wird die leere Zeichenfolge unterbrochen.Die Verwendung der folgenden Optionen umgeht dieses Problem und bietet meiner Meinung nach die schönste und am besten lesbare Syntax der verfügbaren Optionen. Es importiert / stört sich auch nicht mit Regex):
quelle
Sie können auch verwenden
try...except
:quelle
Hier sind meine "Antworten" (ich versuche hier einzigartig zu sein, empfehle ich auch für diesen speziellen Fall nicht :-)
Verwenden von
ord () unddie speziellea <= b <= c
Form:(Dies
a <= b <= c
ist wiea < b < c
ein spezielles Python-Konstrukt und es ist ziemlich ordentlich: Vergleiche1 < 2 < 3
(wahr) und1 < 3 < 2
(falsch) und(1 < 3) < 2
(wahr). So funktioniert es in den meisten anderen Sprachen nicht.)Verwenden eines regulären Ausdrucks :
quelle
ord()
(2) Verliere das^
in der Regex.Sie können reguläre Ausdrücke verwenden .
Sie können Ziffern erkennen mit:
Das [0-9] -Par entspricht einer beliebigen Ziffer, und Ihre Zeichenfolge [: 1] entspricht dem ersten Zeichen Ihrer Zeichenfolge
quelle
Verwenden Sie reguläre Ausdrücke , wenn Sie die Funktionalität der Methode irgendwie erweitern möchten.
quelle
Versuche dies:
quelle
range(10)
erzeugt eine Liste von ganzen Zahlen, währendstring[0]
eine Zeichenfolge der Länge 1 ist.if string[0] in map(str,range(10))
funktioniert