J'ai un tuple répertorié comme tel:

example = (255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 247, 255, 255, 247, 254)

Ce que j'essaie de faire, c'est de le faire représenter par 11111111 (pour 255) et 11110111 (pour 247) etc. etc.

J'ai trouvé qu'avec python3, bin, vous pouvez y parvenir avec:

>>> format(14, '#b'), format(14, 'b')
('0b1110', '1110')

>>>f'{14:#b}', f'{14:b}'
('0b1110', '1110')

Un moyen simple de faire cela pour example serait de le faire à partir d'une boucle for, pour convertir récursivement les valeurs et les ajouter à un tampon.

Mais existe-t-il un moyen de formater directement example pour qu'il soit pythonique et efficace?

-1
jake wong 3 juin 2020 à 21:12

6 réponses

Meilleure réponse

Comme je l'ai compris, vous voulez sortir tout cela en une seule chaîne. Je pense que c'est la manière la plus pythonique de faire ça:

''.join(map(lambda x: f'{x:b}', example))

Production:

'1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111101111111111111111111111111111011111111111111111111111011111111110'
0
Богдан Туренко 3 juin 2020 à 18:17

Utilisez map pour appliquer une fonction de transformation à un itérable arbitraire. Cela produit un itérateur, qui peut être itéré directement ou converti en un type list, tuple ou autre.

>>> tuple(map(bin, example))
('0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111110', '0b11111111', '0b11111111', '0b11111111', '0b11110111', '0b11111111', '0b11111111', '0b11110111', '0b11111110')

Notez que map utilise en interne une boucle, qui est cependant toujours plus efficace qu'un Python classique for. En réalité, la majeure partie du temps d'exécution est consacrée à la transformation, pas à la méthode d'application (map, compréhension, for - boucle, ...), cependant.

1
MisterMiyagi 3 juin 2020 à 18:20

Vous pouvez utiliser la compréhension, comme ceci:

example = (255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 247, 255, 255, 247, 254)

example = tuple(f"{ex:b}" for ex in example)
print(example)
# ('11111111', '11111111', '11111111', '11111111', '11111111', '11111111', '11111111', '11111111', '11111111', '11111111', '11111111', '11111111', '11111111', '11111111', '11111111', '11111111', '11111111', '11111111', '11111111', '11111111', '11111110', '11111111', '11111111', '11111111', '11110111', '11111111', '11111111', '11110111', '11111110')
0
Bram Vanroy 3 juin 2020 à 18:15

Je pense que c'est assez pythonique:

bin_example = [ bin(ex) for ex in example ]
# ['0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111111', '0b11111110', '0b11111111', '0b11111111', '0b11111111', '0b11110111', '0b11111111', '0b11111111', '0b11110111', '0b11111110']
0
Anwarvic 3 juin 2020 à 18:16

Vous pouvez appliquer une fonction à un itérable en utilisant la fonction map sans faire de boucle. En utilisant map, python s'occupera de faire la boucle sur l'itérable et ce sera plus rapide que n'importe quelle boucle for.

Quelque chose comme ça sera plus rapide que n'importe quelle compréhension de liste ou boucle:

result = map(bin,list)

En python3, la fonction de carte renvoie un itérateur que vous pouvez reconvertir en liste ou en tuple en utilisant list () ou tuple ()

1
Edo98 3 juin 2020 à 18:17

Si vous voulez le mettre à l'échelle et le faire sans boucle, la vectorisation est la réponse

b = np.vectorize(lambda x: bin(x)[2:])
example = (255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 247, 255, 255, 247, 254)


print(b(example))

Cela ferait extrêmement bien à l'échelle plus aucune boucle

0
Shahid Khan 3 juin 2020 à 18:42