2017-01-17 5 views
-3

Je veux inverser un chiffre dans une chaîne de 3 chiffres avec Python. Quand j'ai chaîne comme ci-dessous:Inverse un chiffre dans la chaîne avec python

000 

Je veux seulement un inverse de 3 chiffres à la fois. Donc, je veux avoir:

100 or 010 or 001 

Je suis en mesure de le faire avec quelque chose comme:

tmp = 000 
first = int(not(int(tmp[0]))),tmp[1],tmp[2] 

Et je reçois:

(1, '0', '0') #instead of 100 

donc je suppose, je besoin d'autres Est-ce que je peux faire la même chose de façon beaucoup plus efficace et plus simple? Ce genre de casting est agaçant. Merci pour chaque idée!

+0

* pour inverser le chiffre * - il n'y aurait que des entrées avec les chiffres '0' et' 1', n'est-ce pas? – RomanPerekhrest

+0

Parlons-nous de * chiffres binaires *? Donc, nous pouvons choisir un chiffre nous-mêmes? –

+0

Renverser un bit dans un nombre entier est facile; vous pouvez utiliser xor '^'. Ou essayez-vous de produire une chaîne? Quelle est votre entrée et sortie attendues? – khelwood

Répondre

1

L'utilisation d'un dictionnaire avec la valeur inverse fonctionnerait:

>>> flip = {'0': '1', '1':'0'} 
>>> s = '000' 
>>> flip[s[0]] + s[1:] 
'100' 
>>> s[0] + flip[s[1]] + s[2] 
'010' 
>>> s[:2] + flip[s[-1]] 
'001' 
+0

C'est la meilleure solution! Je vous remercie! – Tatarinho

0

Une autre option par une compréhension de la liste, qui prend une index variable pour décider quel bit à retourner.

index = 1 # Which bit to flip 
flip = {'0': '1', '1':'0'} # shortcut to flip 
''.join([x if i != index else flip[x] for i, x in enumerate(string)]) 

ou avec le dict inline:

''.join([x if i != index else {'0': '1', '1': '0'}[x] for i, x in enumerate(string)]) 

qui peut être facilement transformé en fonction:

def flip(string, index): 
    return ''.join([x if i != index else {'0': '1', '1': '0'}[x] for i, x in enumerate(string)]) 
1
def inverse(stri,n): 
    nums = list(stri) 
    if(int(nums[n])==1): 
     nums[n] = '0' 
    elif(int(nums[n])==0): 
     nums[n]= '1' 
    else: 
     return -1 
    return ''.join(map(str,nums)) 


print inverse('000',2) 

retourne '001'

1

Que diriez-vous OU bit à bit (|)? Je pense que ce serait plus rapide (au moins à un niveau inférieur) puisque c'est une opération de base que l'ALU pourrait faire. Là encore, avec toutes les opérations de casting et autres, il se peut que ce soit un peu académique. Quelque chose comme (pardonnez-moi, je commence à apprendre Python):

>>>tmp = '000' 
>>>bit_to_flip = 4 
>>>result = int(tmp)|bit_to_flip 
>>>formatted_result = "{0:b}".format(result).zfill(len(tmp)) 
>>>formatted_result 
'100' 

Accordée, vous devez spécifier que la valeur décimale de chaque chiffre binaire 1,2,4,8, etc ...) . Si vous ne voulez pas vous inquiéter à ce sujet, j'utiliserais un dictionnaire comme Mike mentionné ci-dessus, sauf pour stocker le si au moins pour le rendre agréable et utile à utiliser (et les dictionnaires sont temps constant O (1)):

>>>tmp = '000' 
>>>bits_dict = {'1': 1, '2':2, '3':4} 
>>>bit_to_flip = '1' 
>>>result = int(tmp)|bits_dict[bit_to_flip] 
>>>formatted_result = "{0:b}".format(result).zfill(len(tmp)) 
>>>formatted_result 
'001'