用 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'
我想用 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'