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 list
van int
s 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)