web-dev-qa-db-fra.com

Fusionner deux entiers en Python

Comment puis-je fusionner deux nombres entiers (Par exemple, 10 et 20) en Python et obtenir une valeur renvoyée de 1020 ?

20
Fi3n1k

La meilleure façon de faire cela en python a été donnée dans la réponse acceptée - mais si vous voulez le faire dans des modèles jinja2 - l'opérateur de concaténation ~ vous en fournit un moyen judicieux, car il recherche la représentation unicode de tous les objets. , vous pouvez aussi "concaténer des entiers".

C’est-à-dire que vous pouvez faire ceci (étant donné a=10 et b=20):

{{ a ~ b }}
5
vonPetrushev

Transformez les deux en une chaîne, concaténez les chaînes, puis redonnez le résultat en un entier:

z = int(str(x) + str(y))
31
Konstantin Dinev

L'utilisation des mathématiques est probablement plus rapide que les solutions convertissant str et retour:

Si vous pouvez supposer un deuxième nombre à deux chiffres:

def f(x, y):
    return x*100+y

Usage:

>>> f(1,2)
102
>>> f(10,20)
1020

Bien que, vous souhaitiez probablement que certaines vérifications soient incluses pour vérifier que le deuxième numéro ne dépasse pas deux chiffres. Ou, si votre deuxième numéro peut être un nombre quelconque de chiffres, vous pouvez faire quelque chose comme ceci:

import math
def f(x, y):
    a = math.floor(math.log10(y))
    return int(x*10**(1+a)+y)

Usage:

>>> f(10,20)
1020
>>> f(99,193)
99193

Cependant, cette version ne vous permet pas de fusionner des nombres tels que 03 et 02 pour obtenir 0302. Pour cela, vous devez soit ajouter des arguments pour spécifier le nombre de chiffres dans chaque entier, soit utiliser des chaînes.

6
Matt

en utilisant un formatage de chaîne de style ancien:

>>> x = 10
>>> y = 20
>>> z = int('%d%d' % (x, y))
>>> print z
1020
4
Corey Goldberg

Exemple 1: (L'exemple 2 est beaucoup plus rapide, ne dites pas que je ne vous ai pas prévenu!)

a = 9
b = 8
def concat(a, b):
    return eval(f"{a}{b}")

Exemple:

>>> concat(a, b)
98

Exemple 2:

Pour les personnes qui pensent que eval est 'mauvais', voici une autre façon de le faire:

a = 6
b = 7
def concat(a, b):
    return int(f"{a}{b}")

Exemple:

>>> concat(a, b)
67

MODIFIER:

Je pensais qu'il serait pratique de chronométrer ces codes, regardez ci-dessous:

>>> min(timeit.repeat("for x in range(100): int(str(a) + str(b))", "",
          number=100000, globals = {'a': 10, 'b': 20}))
9.107237317533617
>>> min(timeit.repeat("for x in range(100): int(f'{a}{b}')", "",
          number=100000, globals = {'a': 10, 'b': 20}))
6.4986298607643675
>>> min(timeit.repeat("for x in range(5): eval(f'{a}{b}')", "", #notice the range(5) instead of the range(100)
          number=100000, globals = {'a': 10, 'b': 20}))
4.089137231865948 #x20

Les temps:

eval: about 1 minute and 21 seconds.

original answer: about 9 seconds.

my answer: about 6 and a half seconds.

Conclusion:

La réponse originale semble plus lisible, mais si vous avez besoin d'une vitesse bonne, choisissez int (f '{vara} {varb}')

P.S: La syntaxe de mon int (f '{a} {b}) ne fonctionne que sur python 3.6+, car la syntaxe f' 'n'est pas définie dans les versions de python 3.6-

4

Bien sûr, la réponse «correcte» serait celle de Konstantin. Mais si vous voulez toujours savoir comment le faire sans utiliser de casse de chaîne, juste en math

import math

def numcat(a,b):
    return int(math.pow(10,(int(math.log(b,10)) + 1)) * a + b)

>> numcat(10, 20)
>> 1020
4
zenpoy

Une implémentation difficile mais efficace:

i1,i2 = 10,20
num = int('%i%i' % (i1,i2))

Fondamentalement, vous venez de fusionner deux nombres en une chaîne, puis vous le redonnez à int.

3
irrenhaus3

Juste pour donner une autre solution:

def concat_ints(a, b):
    return a*(10**len(str(b)))+b

>>> concat_ints(10, 20)
1020
2
Gareth Latty

En utilisant cette fonction, vous pouvez concaténer autant de nombres que vous le souhaitez.

def concat(*args):
    string = ''
    for each in args:
        string += str(each) 
    return int(string)

Par exemple, concat(20, 10, 30) renverra 201030 un entier

OU

Vous pouvez utiliser le programme d'une ligne

int(''.join(str(x) for x in (20,10,30)))

Cela renverra également 201030.

1
arulmr

Une bonne façon aussi serait d'utiliser la fonction de réduction intégrée ():

reduce(lambda x,y:x*10+y,[10,20])
0
Berend

Voici une autre façon de le faire:

a = 10
b = 20

x = int('{}{}'.format(a, b))
0
Jonathan