Soru Python'da bir dize veya int için bir dizeyi nasıl ayrıştırabilirim?


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.


1761
2017-12-19 01:52


Menşei


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


Cevaplar:


>>> a = "545.2222"
>>> float(a)
545.22220000000004
>>> int(float(a))
545

2087
2017-12-19 01:54



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


def num(s):
    try:
        return int(s)
    except ValueError:
        return float(s)

443
2017-12-19 02:31



ü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:

def isfloat(value):
  try:
    float(value)
    return True
  except:
    return False

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:

val                   isfloat(val) Note
--------------------  ----------   --------------------------------
""                    False        Blank string
"127"                 True         Passed string
True                  True         Pure sweet Truth
"True"                False        Vile contemptible lie
False                 True         So false it becomes true
"123.456"             True         Decimal
"      -127    "      True         Spaces trimmed
"\t\n12\r\n"          True         whitespace ignored
"NaN"                 True         Not a number
"NaNanananaBATMAN"    False        I am Batman
"-iNF"                True         Negative infinity
"123.E4"              True         Exponential notation
".1"                  True         mantissa only
"1,234"               False        Commas gtfo
u'\x30'               True         Unicode is fine.
"NULL"                False        Null is not special
0x3fade               True         Hexadecimal
"6e7777777777777"     True         Shrunk to infinity
"1.797693e+308"       True         This is max value
"infinity"            True         Same as inf
"infinityandBEYOND"   False        Extra characters wreck it
"12.34.56"            False        Only one dot allowed
u'四'                 False        Japanese '4' is not a float.
"#56"                 False        Pound sign
"56%"                 False        Percent of what?
"0E0"                 True         Exponential, move dot 0 places
0**0                  True         0___0  Exponentiation
"-5e-5"               True         Raise to a negative number
"+1e1"                True         Plus is OK with exponent
"+1e1^5"              False        Fancy exponent not interpreted
"+1e1.3"              False        No decimals in exponent
"-+1"                 False        Make up your mind
"(1)"                 False        Parenthesis is bad

Sayıların ne olduğunu biliyor musun? Düşündüğün kadar iyi değilsin! Büyük sürpriz değil.


416
2018-01-05 04:15



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'

>>> import ast
>>> ast.literal_eval("545.2222")
545.2222
>>> ast.literal_eval("31")
31

104
2018-03-01 04:23



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


float(x) if '.' in x else int(x)

74
2017-12-19 02:32



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


Yerelleştirme ve virgül

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:

>>> import locale
>>> a = u'545,545.2222'
>>> locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.atof(a)
545545.2222
>>> int(locale.atof(a))
545545
>>>

Örnek 2 - Avrupa numara sözleşmeleri

İç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:

>>> import locale
>>> b = u'545,2222'
>>> locale.setlocale(locale.LC_ALL, 'fr_FR')
'fr_FR'
>>> locale.atof(b)
545.2222

Yöntem locale.atoi ayrıca kullanılabilir, ancak argüman bir tamsayı olmalıdır.


45
2017-07-23 16:00





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.

>>> x = ["545.0", "545.6", "999.2"]
>>> map(float, x)
[545.0, 545.60000000000002, 999.20000000000005]
>>>

Hepsi aynı tipte ise sadece iyidir.


22
2017-12-19 02:09





Üçü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:

>>> from fastnumbers import fast_real
>>> fast_real("545.2222")
545.2222
>>> type(fast_real("545.2222"))
float
>>> fast_real("31")
31
>>> type(fast_real("31"))
int

21
2017-08-14 03:21





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:

"545.2222" Batmak:

>>> float("545.2222")
545.2222

"31"bir tam sayıya:

>>> int("31")
31

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:

>>> int("0b11111", 2)
31
>>> int("11111", 2)
31
>>> int('0o37', 8)
31
>>> int('37', 8)
31
>>> int('0x1f', 16)
31
>>> int('1f', 16)
31

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:

>>> int("0b11111", 0)
31
>>> int('0o37', 0)
31
>>> int('0x1f', 0)
31

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

>>> 0b11111
31

Sekizli, önek 0o

>>> 0o37
31

Onaltılık, önek 0x

>>> 0x1f
31

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:

>>> 0b10101 # binary flags
21
>>> 0o755 # read, write, execute perms for owner, read & ex for group & others
493
>>> 0xffffff # the color, white, max values for red, green, and blue
16777215

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.

>>> 037
31

Kötü çünkü değerin olması gerektiği gibi görünüyor 37. Yani Python 3'te, şimdi bir yükseltir SyntaxError:

>>> 037
  File "<stdin>", line 1
    037
      ^
SyntaxError: invalid token

Python 2 oktanlarınızı hem 2 hem de 3'te çalışan sekizliklere dönüştürün. 0o önek:

>>> 0o37
31

17
2017-07-23 13:26





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:

   >>> import string
   >>> parseStr = lambda x: x.isalpha() and x or x.isdigit() and \
   ...                      int(x) or x.isalnum() and x or \
   ...                      len(set(string.punctuation).intersection(x)) == 1 and \
   ...                      x.count('.') == 1 and float(x) or x
   >>> parseStr('123')
   123
   >>> parseStr('123.3')
   123.3
   >>> parseStr('3HC1')
   '3HC1'
   >>> parseStr('12.e5')
   1200000.0
   >>> parseStr('12$5')
   '12$5'
   >>> parseStr('12.2.2')
   '12.2.2'

16
2017-09-28 19:45



1e3 python'da bir sayıdır, ancak kodunuza göre bir dizedir. - Cees Timmerman