用 python 反转字符串中的一位数字

Inverse one digit in string with python

我想用 Python 反转 3 位字符串中的数字。 当我有如下字符串时:

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

所以我想,我需要其他铸造等。

我可以用更有效和更简单的方式来做同样的事情吗?这种铸造很烦人。 谢谢你的每一个想法!

使用具有反向值的字典会起作用:

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

通过列表理解的另一个选项,它采用变量 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)])

或内联字典:

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

returns '001'

按位或 (|) 怎么样?我认为它会更快(至少在较低级别),因为这是 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 等的十进制值...)。如果您不想担心这一点,我会使用像上面提到的 Mike 这样的字典,除了存储 if 至少使其使用起来美观和整洁(并且字典是常数时间 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'