2017-01-17 28 views
-3

Я хочу инвертировать цифру в 3-значной строке с помощью Python. Когда у меня есть строка, как показано ниже:Обратная одна цифра в строке с python

000 

Я хочу, чтобы инвертировать только один из 3 цифр сразу. Поэтому я хочу, чтобы иметь:

100 or 010 or 001 

Я могу сделать это с чем-то вроде:

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

И я получаю:

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

Так что я думаю, мне нужно другое литье и т. д.

Могу ли я сделать то же самое гораздо более эффективным и простым способом? Этот вид литья раздражает. Спасибо за любую идею!

+0

* Обратный символ * - будут только входы с цифрами '0' и' 1', правильно? – RomanPerekhrest

+0

Мы говорим о * двоичных * цифрах? Итак, мы можем выбрать цифру сами? –

+0

Легко перевернуть бит в целое число; вы можете использовать xor '^'. Или вы пытаетесь создать строку? Каковы ваши ожидаемые результаты и результаты? – khelwood

ответ

1

Используя словарь с обратным значением будет работать:

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

Это лучшее решение! Спасибо! – Tatarinho

0

Другой вариант через список понимания, который принимает переменную index, чтобы решить, какой бит переворачивать.

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

или с Dict встраиваемыми:

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

, которые могут быть легко превращены в функции:

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) 

возвращает '001'

1

Как насчет побитовое ИЛИ (|)? Я бы подумал, что это будет быстрее (по крайней мере, на более низком уровне), поскольку это базовый op, который может сделать ALU. Опять же, со всеми кастингом и другими действиями, которые происходят, это может быть немного академическим. Что-то вроде (прости меня, я начинаю изучать 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' 

Конечно, вам нужно указать только десятичное значение каждой двоичной цифры 1,2,4,8, и т.д. ...) , Если вы не хотите беспокоиться об этом, я бы использовал словарь, как указано Майком выше, за исключением того, чтобы хранить, если хотя бы сделать его приятным и аккуратным для использования (и словари - это постоянное время 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' 

 Смежные вопросы

  • Нет связанных вопросов^_^