Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在保留原始大小写的同时反转字符串中的字母(但不是非字母)_Python_Python 3.x - Fatal编程技术网

Python 在保留原始大小写的同时反转字符串中的字母(但不是非字母)

Python 在保留原始大小写的同时反转字符串中的字母(但不是非字母),python,python-3.x,Python,Python 3.x,例如这句话: 'God bless our brave Confederates, Lord!' ……应该是: 'Dro lseta red efnoc Evarbruossel, Bdog!' 我的代码当前为: def reversing(sentence): code = [] for l1, l2 in zip(sentence, sentence[::-1]): if l1.isalpha() and l2.isalpha():

例如这句话:

'God bless our brave Confederates, Lord!'
……应该是:

'Dro lseta red efnoc Evarbruossel, Bdog!'
我的代码当前为:

def reversing(sentence):
    code = []
    for l1, l2 in zip(sentence, sentence[::-1]):
        if l1.isalpha() and l2.isalpha():
            l2 = l2.upper() if l1.isupper() else l2.lower()
        code.append(l2)
    return ''.join(code)
但这并不完全正确:

>>> reversing('God bless our brave Confederates, Lord!')
'!drol ,setaredefnoc Evarb ruo sselB doG'

我的解决方案产生了预期的效果,但它的缺点是在同一个列表上迭代两次。如果这方面的实际应用需要较长的输入,那么从执行时间的角度来看,此解决方案将不是最好的

def反转(句子):
零件=列表(句子)
代码=[]
#第一次迭代只反转字母
对于枚举,枚举中的值(部分):
character=句子[-1-枚举].lower()
如果character.isalpha():
代码追加(字符)
#第二次迭代格式化并插入非字母
对于枚举,枚举中的值(部分):
如果value.isalpha()和value.isupper():
code[enum]=code[enum].upper()
elif not value.isalpha():
代码.插入(枚举,值)
返回“”。加入(代码)

一个简单的基于堆栈和队列的解决方案

a= 'God bless our brave Confederates, Lord!'

stack=[] # to keep characters
queue=[] # to keep special chars
for i in a:
    if i.isalpha():
        stack.append(i)
    else:
        queue.append(i)
对原始字符串进行迭代,以查找并检查char是否为大写字符,以及它是否为特殊字符

string=''
for i in a:  
    if i.isalpha():
        if i.isupper():
            string += stack.pop(-1).upper() # change from lower to upper char based on original string
        else:
            string += stack.pop(-1).lower()
    else:
        string += queue.pop(0)
print(string)
输出

'Dro Lseta red efnoC Evarbruossel, Bdog!'

是否应绝对尊重大写字母?是的,例如,如果原始句子中的第一个字母是大写字母,则相反句子中的第一个字母也必须是大写字母,同样适用于lowercases@BlueSheepToken听起来不错。我更新了我的答案以反映这一点。谢谢