Hoe strings omzetten in gehele getallen?

Ik heb een tuple van tuples van een MySQL-query als volgt:

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

Ik zou graag alle tekenreekselementen in gehele getallen willen converteren en ze weer in een lijst met lijsten plaatsen:

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

Ik heb geprobeerd het te bereiken met eval, maar heeft nog geen fatsoenlijk resultaat gehad.


Antwoord 1, Autoriteit 100%

int()is de Python-standaard ingebouwde functie om een ​​tekenreeks om te zetten in een geheel getal. U noemt het met een tekenreeks met een nummer als het argument en het retourneert het getal dat is geconverteerd naar een geheel getal:

>>> int("1") + 1
2

Als u de structuur van uw lijst kent, t1 (dat het eenvoudig lijsten bevat, slechts één niveau), kunt u dit in Python 3:

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

In Python 2:

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

Antwoord 2, Autoriteit 4%

U kunt dit doen met een lijst Begreefdy:

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

Het binnenste lijstbegrip ([int(column) for column in row]) bouwt een listvan ints op uit een reeks van int-objecten, zoals decimale tekenreeksen, in row. Het buitenste lijstbegrip ([... for row in T1])) stelt een lijst samen van de resultaten van het binnenste lijstbegrip toegepast op elk item in T1.

Het codefragment mislukt als een van de rijen objecten bevat die niet kunnen worden geconverteerd door int. Je hebt een slimmere functie nodig als je rijen wilt verwerken die niet-decimale tekenreeksen bevatten.

Als je de structuur van de rijen kent, kun je het binnenste lijstbegrip vervangen door een aanroep van een functie van de rij. Bijv.

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

Antwoord 3, autoriteit 3%

Ik gebruik liever alleen begripslijsten:

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

Antwoord 4, autoriteit 2%

In plaats van int( ), plaats je float( )waarmee je decimalen naast gehele getallen kunt gebruiken.


Antwoord 5, autoriteit 2%

Ik ben het tot nu toe eens met de antwoorden van iedereen, maar het probleem is dat als je niet alle gehele getallen hebt, ze zullen crashen.

Als u niet-gehele getallen wilt uitsluiten,

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

Dit levert alleen werkelijke cijfers op. De reden dat ik geen directe lijstbegrippen gebruik, is omdat lijstbegrip hun interne variabelen lekt.


Antwoord 6

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

Antwoord 7

Probeer dit.

x = "1"

x is een tekenreeks omdat er aanhalingstekens omheen staan, maar er staat een getal in.

x = int(x)

Aangezien x het getal 1 bevat, kan ik het omzetten in een geheel getal.

Als je wilt zien of een tekenreeks een getal is, kun je dit doen.

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)

Het zou moeten afdrukken naar IDLE True omdat x een getal is.

y_test = is_number(y)
print(y_test)

Het zou moeten afdrukken naar IDLE False omdat y geen getal is.


Antwoord 8

Lijstbegrippen gebruiken:

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

Antwoord 9

Bekijk deze functie

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

Dan

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

U kunt

ook controleren

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

Antwoord 10

Nog een andere functionele oplossing voor Python 2:

from functools import partial
map(partial(map, int), T1)

Python 3 zal echter een beetje rommelig zijn:

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

We kunnen dit oplossen met een wikkel

def oldmap(f, iterable):
    return list(map(f, iterable))
oldmap(partial(oldmap, int), T1)

Antwoord 11

in Python 3.5.1 Dingen zoals deze werk:

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

en

Enter number:  4.7
4
5

George.


Antwoord 12

Python heeft ingebouwde functie-int (string) en optionele parameterbasis.

Als uw tekenreeks een geheel getal-waarde bevat, zal deze deze converteren op de corresponderende integerwaarde.
Als u echter decimnaal nummer als een reeks hebt, heeft u drijver nodig () om het te converteren.

Gebruik:

a = '22'
b = int(a)

en

if a = '22.22'
b = int(a) '''will give error, invalid literal for int().'''
b = float(a) '''will convert the string.'''

Antwoord 13

Als het maar een tuple van tupels is, zal iets als rows=[map(int, row) for row in rows]het lukken. (Er is een lijstbegrip en een oproep om map(f, lst), wat gelijk is aan [f(a) voor a in lst], daarin te vinden.)

Eval is nietwat u wilt doen, voor het geval er om de een of andere reden iets als __import__("os").unlink("importantsystemfile")in uw database staat .
Valideer altijd uw invoer (indien met niets anders, zal de uitzondering int() verhogen als u slechte invoer heeft).


Antwoord 14

Ik wil een beschikbare optie delen die hier nog niet genoemd lijkt te worden:

rumpy.random.permutation(x)

Genereert een willekeurige permutatie van array x. Niet precieswaar je om vroeg, maar het is een mogelijke oplossing voor soortgelijke vragen.


Antwoord 15

Je kunt zoiets als dit doen:

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)  

Other episodes