Python'da bir dize veya int için bir dizeyi nasıl ayrıştırabilirim? | tutuappapks.com
Python'da, nümerik bir dizeyi nasıl ayrıştırabilirim? "545.2222" karşılık gelen yüzdürme değerine, 542.2222? Ya da dizgeyi ayrıştır "31" bir tam sayıya, 31?
Sadece nasıl ayrıştırılacağını bilmek istiyorum şamandıra string bir floatve ayrı olarak int string bir int.
Genel bir kural olarak, Python'da bir nesneniz varsa ve dönüştürmek istiyorsanız için bu tip nesne, çağrı type(my_object) üstünde. Sonuç genellikle dönüşümü yapacak bir işlev olarak çağrılabilir. Örneğin type(100) sonuç int, böylece arayabilirsin int(my_object) dönüştürmek denemek my_object bir tam sayıya. Bu her zaman işe yaramaz, ancak kodlamada iyi bir "ilk tahmin" dir. - robertlayton
Sonunda neden '04' olduğunu merak ediyorum? neden sadece '00' değil? ayrıca benim mevcut python versiyonum '04' değil. - Mangat Rai Modi
@MangatRaiModi Kayan nokta sayıları, ondalık sayıları temsil etmek için doğal olarak kusurludur. Daha fazla bilgi için bkz. stackoverflow.com/q/21895756/931277 - dokkaebi
neden basitçe değil int(a) fakat int(float(a)) ? - user463035818
int(a) dizenin geçerli bir tam sayı olmadığı konusunda bir hata verir: ValueError: invalid literal for int() with base 10: '545.222'ancak bir floattan int'ye dönüştürmek desteklenen bir dönüşümdür. - David Parks
üstü kapalı Şamandıraların / inlerin karıştırılması, şamandıralarla çalışırken veya diğer / Şamandıra / ints operatör. Bağlamıza bağlı olarak, her ikiside de int veya float döndürmek tercih edilebilir. - jfs
@ J.F.Sebastian Tamamen doğru, ama girişin hangisinin olacağını dikte etmek istediğiniz zamanlar vardır. Girdiye izin vermek, hangisinin ördek yazarak güzelce çalışabileceğini dikte eder. - TimothyAWiseman
Başka bir yuva yapabilirsin try Float için dönüştürülemez bir istisna atmak için. - iBug
Bir dizenin bir kayan olup olmadığını kontrol etmek için Python yöntemi:
Bu işlev için daha uzun ve daha doğru bir ad olabilir: isConvertibleToFloat(value)
Nedir ve içinde bir şamandıra yoktur piton sizi şaşırtabilir:
Sayıların ne olduğunu biliyor musun? Düşündüğün kadar iyi değilsin! Büyük sürpriz değil.
Lütfen işlevinizi yeniden adlandırmayı düşünün convertibleToFloat ya da benzer bir şey (şimdiki adı en azından benim için kafa karıştırıcı gibi görünüyor). - MKPS
Bu, burada değinmeyi hak eden başka bir yöntemdir. ast.literal_eval:
Bu, güvenilmeyen kaynaklardan Python ifadelerini içeren dizeleri, değerlerin ayrıştırılması gerekmeden güvenli bir şekilde değerlendirmek için kullanılabilir.
Yani güvenli bir 'değerlendirme'
bu değil Soruna iyi bir çözüm. Python 2'de iyi çalışıyor, ancak Python 3'te şunlar oluyor: python >>> import ast >>> ast.literal_eval('1-800-555-1212') -2566 >>> Bunun neden bir sorun olduğunu açıklığa kavuşturmak için, telefon numaralarını yalnız bırakmak ve matematiksel ifadeler olduklarını varsaymak istemiyorsanız, bu yaklaşım sizin için değildir. - royce3
@ royce3 Evet, bu iyi bir nokta ve kullanıcıların dikkat etmeleri gerekiyor. Davranış, karmaşık sayıların ayrıştırılmasıyla ilgili bazı sorunları ele almak için başlangıçta değiştirilmiştir. Muhtemelen bir böcek ast.literal_evalve tartışıldı İşte. - wim
Nitpick: Float ("2e-3") gibi aşırı durumlarda çalışmıyor - Emile
Not: Bazı ülkeler ondalık ayırıcı olarak "," kullandığından, dizeler olarak geçirilen para miktarı ile uğraşırken dikkatli olun - Ben G
@Emile: "2e-3" diye bir "aşırı durum" demezdim. Bu cevap sadece bozuldu. - jchl
@BenG Para bir float olarak manipüle etmeyin. Bu bela istiyor. Para için ondalık kullanın! (Ama ',' hakkındaki yorumunuz hala geçerli ve önemli. - ToolmakerSteve
"Bir sayı değil" (NaN) ve +/- sonsuzluğun da geçerli float değerleri olduğunu unutmayın. Yani float("nan") Yukarıdaki cevabın hiç yakalayamayacağı mükemmel bir geçerli değerdir. - Ronny Andersson
Gibi durumlar için, bir sayının dizgisi temsilinde virgül olasılığını düşünmelisiniz float("545,545.2222") bir istisna atar. Bunun yerine, locale Dizeleri sayılara dönüştürmek ve virgülleri doğru şekilde yorumlamak için. locale.atof Metot, istenen numara sözleşmesi için yerel ayar bir kez ayarlandıktan sonra bir adımda bir şamandıraya dönüştürülür.
Örnek 1 - Amerika Birleşik Devletleri sayı sözleşmeleri
Birleşik Devletler ve Birleşik Krallık'ta, virgüller binlerce ayırıcı olarak kullanılabilir. Amerikan yerel ayarı ile bu örnekte, virgül ayırıcı olarak düzgün bir şekilde ele alınır:
İçinde dünyanın çoğu ülkesivirgüller, dönemler yerine ondalık işaretler için kullanılır. Fransızca yerel ayarıyla bu örnekte, virgül bir ondalık işareti olarak doğru şekilde işlenir:
Yöntem locale.atoi ayrıca kullanılabilir, ancak argüman bir tamsayı olmalıdır.
Kullanıcılar codelogic ve harley Doğru, ancak dize bir tamsayı olduğunu biliyorsanız (örneğin, 545), ilk yüzdürme yapmak için int ("545") çağırabilirsiniz, unutmayın.
Dizeleriniz listede varsa, harita işlevini de kullanabilirsiniz.
Hepsi aynı tipte ise sadece iyidir.
Üçüncü taraf modüllere karşı değilseniz, kontrol edebilirsiniz. fastnumbers modülü. Bu bir işlev sağlar fast_real Bu sorunun tam olarak ne istediğini yapar ve bunu bir Python uygulamasından daha hızlı yapar:
Python'da, "545.2222" gibi sayısal bir dizgeyi karşılık gelen yüzer değerine, 542.2222'ye nasıl ayrıştırabilirim? Ya da "31" dizesini bir tam sayıya, 31? Sadece bir float dizesini bir float'a (ve ayrıca) bir int dizisine nasıl ayrıştırılacağını bilmek istiyorum.
Bunları ayrı ayrı yapmak için sormanız iyidir. Onları karıştırıyorsanız, daha sonra sorunlarınız için kendinizi ayarlamış olabilirsiniz. Basit cevap:
"31"bir tam sayıya:
Diğer dönüşümler, dizeler ve dizilerden gelen ve gidenler:
Çeşitli tabanlardan gelen dönüşümler ve önceden tabanı bilmeniz gerekir (varsayılan değer 10'dur). Onları Python'un hazırlıkları için ne beklediğini (aşağıya bakınız) veya ön eki kaldırabileceğinizi unutmayın:
Tabanı önceden bilmiyorsanız, ancak doğru ön ekine sahip olduklarını biliyorsunuz, Python eğer geçerseniz bunu sizin için çıkarabiliyor. 0 üs olarak:
Diğer Bazlardan Ondalık Olmayan (yani Tamsayı) Yazılar
Eğer sizin motivasyonunuz kendi kodunuzun açıkça kodlanmış belirli değerleri temsil etmesini sağlamaksa, üslerden dönüştürmeniz gerekmeyebilir - Python'u sizin için doğru sözdizimi ile otomatik olarak yapmanıza izin verebilirsiniz.
Tam sayılarla otomatik dönüşümü elde etmek için ön ekleri kullanabilirsiniz. aşağıdaki değişmezler. Bunlar Python 2 ve 3 için geçerlidir:
İkili, önek 0b
Sekizli, önek 0o
Bu, ikili bayraklar, kodda dosya izinleri veya renkler için onaltılık değerler açıklanırken yararlı olabilir - örneğin, no notları not edin:
Python 3 ile uyumlu muğlak Python 2 çevrimleri yapma
Python 2'de 0 ile başlayan bir tamsayı görürseniz, bu (kullanımdan kaldırılmış) sekizli sözdizimi.
Kötü çünkü değerin olması gerektiği gibi görünüyor 37. Yani Python 3'te, şimdi bir yükseltir SyntaxError:
Python 2 oktanlarınızı hem 2 hem de 3'te çalışan sekizliklere dönüştürün. 0o önek:
Soru biraz yaşlı görünüyor. Ama bir fonksiyon önerelim, parseStr, benzer bir şey yapan, yani, tamsayıya veya yüzdeye döndüren ve verilen bir ASCII dizgisinin hiçbirine dönüştürülemezse, ona dokunulmadan döndürür. Elbette kod sadece istediğini yapmak için ayarlanabilir:
1e3 python'da bir sayıdır, ancak kodunuza göre bir dizedir. - Cees Timmerman
WPF'deki bir pencereyi simge durumuna küçültün? R sınıfının niteliklerine erişmenin daha kolay bir yolu var mı, nokta gösterimini kullanabilir miyim? MediaRecorder.stop () Android 4.0 (ICS) ile asılı navigator.geolocation.getCurrentPosition (), Android'deki WebView'de hiçbir zaman döndürmez Ayrı bir süreçte bir servis başlat Pencerelerde, bir çocuk işleminin okuduğu ve yazdığı dosyaları C'de nasıl izleyebilirim? düzenli ifade ve eğik çizgi