Dizeleri Python'da tamsayılara dönüştürmek nasıl?


438

Böyle bir MySQL sorgudan tuples bir demet var:

T1 = (('13', '17', '18', '21', '32'),
      ('07', '11', '13', '14', '28'),
      ('01', '05', '06', '08', '15', '16'))

Tüm dize öğelerini tamsayılara dönüştürmek ve tekrar bir liste listesine koymak istiyorum:

T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]

Ben bunu elde etmek için çalıştı evalama henüz iyi bir sonuç alamadım.


2
Belki de farklı bir veritabanı adaptörü modülü düşünün? PostgreSQL adaptör modüllerinin T2 setiniz gibi sonuçlar getireceğini biliyorum.
kquinn


lütfen dikkat: harita kullanırken, python 3 ve 3.5'te harita nesnelerinin bir listesini alırsınız. Bu, yukarıda belirtildiği gibi Python 3.5 için yapar. new_list = a.isdigit () ise T1'deki b için liste (a (b için a (b) için liste))
Konuk

Benzer soru için yuvalanmamış bir liste: Bir dizindeki tüm dizeleri int dönüştürmek
Aran-Fey

Yanıtlar:


630

int()bir dizeyi tamsayı değerine dönüştüren Python standart yerleşik işlevidir. Bağımsız değişken olarak sayı içeren bir dize ile çağırırsınız ve tamsayıya dönüştürülen sayıyı döndürür:

print (int("1") + 1)

Yukarıdaki baskılar 2.

Listenizin yapısını biliyorsanız, T1 (sadece listeleri içerir, sadece bir seviye), bunu Python 2'de yapabilirsiniz:

T2 = [map(int, x) for x in T1]

Python 3'te:

T2 = [list(map(int, x)) for x in T1]

4
neden olmasın T2 = map(lambda lol: map(int, lol), T1)? Harita veya liste kavrayışları, her ikisi de aptalca;)
uçan koyun

4
@flyingsheep Çift harita bana aptalca geliyor, bu iyi görünüyor.
jamylak

Python 2 örneğini kaldırmaya ne dersiniz (Python2 için ömrünün sonu nedeniyle)?
Alisso

28

Bunu bir liste kavrayışı ile yapabilirsiniz:

T2 = [[int(column) for column in row] for row in T1]

İç liste kavrama ( [int(column) for column in row]) bir inşa listait intbir sekanstan s intdecimal teli -Able nesneleri row. Dış liste kavrama ( [... for row in T1])), içindeki her öğeye uygulanan iç liste kavrama sonuçlarının bir listesini oluşturur T1.

Satırlardan herhangi biri tarafından dönüştürülemeyen nesneler içeriyorsa, kod snippet'i başarısız olur int. Ondalık olmayan dizeler içeren satırları işlemek istiyorsanız daha akıllı bir işleve ihtiyacınız olacaktır.

Satırların yapısını biliyorsanız, iç liste kavrayışını satırın bir işlev çağrısı ile değiştirebilirsiniz. Örneğin.

T2 = [parse_a_row_of_T1(row) for row in T1]

16

Sadece anlama listelerini kullanmayı tercih ederim:

[[int(y) for y in x] for x in T1]

12

int( )Koymak yerine, float( )tamsayılarla birlikte ondalık sayıları kullanmanıza izin veren koyun .


2
Cevabınız hakkında daha fazla ayrıntı açıklayabilir misiniz?
Rico

10

Ben şimdiye kadar herkesin cevapları ile kabul ediyorum ama sorun şu ki eğer tüm tamsayıları yoksa onlar çökecek.

Tamsayı olmayanları hariç tutmak istiyorsanız

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())

Bu sadece gerçek rakamları verir. Doğrudan liste kavrayışlarını kullanmamamın nedeni, liste kavramanın iç değişkenlerini sızdırmasıdır.


2
isdigitzor, deneyin -1. / int(<str>)ile kontrol etmenin yolu . tryexcept
totoro

9
T3=[]

for i in range(0,len(T1)):
    T3.append([])
    for j in range(0,len(T1[i])):
        b=int(T1[i][j])
        T3[i].append(b)

print T3

7
Stack Overflow'a hoş geldiniz! Lütfen yalnızca bir kod bloğu göndermek yerine, bu kodun neden ortaya çıkan sorunu çözdüğünü açıklayın. Bir açıklama olmadan, bu bir cevap değildir.
Artemix

7

Bunu dene.

x = "1"

x bir dizedir çünkü etrafında tırnaklar vardır, fakat içinde bir sayı vardır.

x = int(x)

X'in içinde 1 sayısı olduğu için onu bir tamsayıya çevirebilirim.

Bir dizenin sayı olup olmadığını görmek için bunu yapabilirsiniz.

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)

X bir sayı olduğu için IDLE True olarak yazdırılmalıdır.

y_test = is_number(y)

print(y_test)

IDLE Yanlış seçeneğine yazdırmalıdır, çünkü bir sayı değil.


2
İs_number işleviniz yanlış. '1', 1'e eşit değildir. Bu Perl değildir. :-P
Veky

3
Tekerleği yeniden icat etmeyin, kullanın x.isnumeric().
bfontaine

4

Liste kavrayışlarını kullanma:

t2 = [map(int, list(l)) for l in t1]

1
python 3'te bu harita nesnelerinin bir listesini döndürür :(
CpILL

3

Python 3.5.1'de bunun gibi şeyler çalışır:

c = input('Enter number:')
print (int(float(c)))
print (round(float(c)))

ve

Enter number:  4.7
4
5

George.


3

Bu işlevi görün

def parse_int(s):
    try:
        res = int(eval(str(s)))
        if type(res) == int:
            return res
    except:
        return

Sonra

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

Ayrıca kontrol edebilirsiniz

if val == None:  # True if input value can not be converted
    pass  # Note: Don't use 'if not val:'

evalşeytani: yerine koymalısınız ast.literal_eval.
Eli Korvigo

3

Python 2 için bir başka fonksiyonel çözüm:

from functools import partial

map(partial(map, int), T1)

Python 3 biraz dağınık olacak:

list(map(list, map(partial(map, int), T1)))

bunu bir sarıcı ile düzeltebiliriz

def oldmap(f, iterable):
    return list(map(f, iterable))

oldmap(partial(oldmap, int), T1)

1

Eğer sadece bir demet tuple varsa, böyle bir şey rows=[map(int, row) for row in rows]hile yapar. (Orada bir liste kavrayışı ve (f, lst) eşlemesi için bir çağrı var.

Eval, veritabanınızda bir nedenden dolayı bir şey olması durumunda yapmak istediğiniz şey değildir__import__("os").unlink("importantsystemfile") . Girişinizi her zaman doğrulayın (başka hiçbir şey yoksa, hatalı girişiniz varsa int () istisnası artar).


-1

Bunun gibi bir şey yapabilirsiniz:

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)  

-1

Henüz burada belirtilmemiş gibi görünen bir seçeneği paylaşmak istiyorum:

rumpy.random.permutation(x)

X dizisinin rastgele permütasyonunu oluşturur. Tam olarak ne istediğini değil , benzer sorulara potansiyel bir çözüm.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.