【问题标题】:How do I add character padding to a string?如何将字符填充添加到字符串?
【发布时间】:2012-04-21 16:29:39
【问题描述】:

好的,这很难解释,但我想在句子中添加填充,以便该句子中的字符是 n 的倍数。

但是这个数字“4”必须更改为 3 和 5,所以它也必须工作..

谁知道我在说什么??以及怎么做?

【问题讨论】:

  • 与izip_longest 有关系是我的猜测,但我仍在努力理解这个问题
  • 是的,我也很困惑:/
  • 其实是nvm...我不认为是...
  • 我想我必须在文本的每一侧从右边开始添加一个 X,直到它适合所需的字符数量??
  • nvm 我的坏,现在我明白了。

标签: python string padding


【解决方案1】:
def pad(yourString,blockLength):
    return yourString + ("X" * (blockLength - (len(yourString) % blockLength)))

是你的填充函数。用于结束填充。 如果您需要中心填充使用:

def centerPad(yourString,blockLength):
    return ("X" * ((blockLength - (len(yourString) % blockLength))/2)) + yourString + ("X" * ((blockLength - (len(yourString) % blockLength))/2))

如果您想实现块密码,则需要更仔细地查看其余代码。

【讨论】:

  • 什么是分组密码?是不是像解密一样?因为我已经这样做了并且它可以工作......或者它是否与此有关 - TypeError:并非所有参数都在字符串格式化期间转换,这是我测试时shell返回的内容
  • a block cypher 看起来像是您正在尝试做的事情。您对错误消息是正确的。我更正了。
  • 来自 Python 之禅,作者 Tim Peters,Readability counts.
【解决方案2】:
>>> import math
>>> def encrypt(string, length):
        inverse_string = string.replace(' ','X')[::-1]

        center_width = int(math.ceil(len(inverse_string)/float(length)) * length) # Calculate nearest multiple of length rounded up

        inverse_string = inverse_string.center(center_width,'X')

        create_blocks = ' '.join(inverse_string[i:i+length] for i in xrange(0,len(inverse_string),length))
        return create_blocks

>>> encrypt('THE PRICE OF FREEDOM IS ETERNAL VIGILENCE', 4)
'XECN ELIG IVXL ANRE TEXS IXMO DEER FXFO XECI RPXE HTXX'

【讨论】:

  • for encrypt('THE PRICE OF FREEDOM IS ETERNAL VIGILENCE', 5) 你的程序返回:XECNE LIGIV XLANR ETEXS IXMOD EERFX FOXEC IRPXE HTXX 其中'htxx'的长度为4,这是错误的吗?
  • 哦,抱歉忘记使用长度参数了……不好意思,我会在中添加
  • 好吧,这行得通.. 几乎,至少对于它来说,但它不适用于不均匀的块长度.. 像 1,3 和 5
  • @Chaudhary 你怎么知道这个?
  • 嗯center 似乎不适用于奇数,使用@Abhijit 的方法
【解决方案3】:

我希望下面的自我注释代码可以帮助您掌握这个概念。你只需要做一些数学运算就可以得到两端的填充字符

一些概念

  1. 需要额外字符填充 = len(string) % block_length
  2. Total_Pad_Characters = block_length - len(string) % block_length
  3. 前面的填充字符 = Total_Pad_Characters/2
  4. 填充字符末尾 = Total_Pad_Characters - Total_Pad_Characters/2

这里是代码

>>> def encrypt(st,length):
    #Reversed the String and replace all Spaces with 'X'
    st = st[::-1].replace(' ','X')
    #Find no of characters to be padded.
    padlength = (length - len(st)%length) % length
    #Pad the Characters at either end
    st = 'X'*(padlength/2)+st+'X'*(padlength-padlength/2)
    #Split it with size length and then join with a single space
    return ' '.join(st[i:i+length] for i in xrange(0,len(st),length))

>>> encrypt('THE PRICE OF FREEDOM IS ETERNAL VIGILENCE', 4) #Your Example
'XECN ELIG IVXL ANRE TEXS IXMO DEER FXFO XECI RPXE HTXX'
>>> encrypt('THE PRICE', 5) # One Extra Character at end for Odd Numbers
'ECIRP XEHTX'
>>> encrypt('THE PRIC', 5) # 1 Pad Characters at either end
'XCIRP XEHTX'
>>> encrypt('THE PRI', 5) # 1 Pad Characters at either end and one Extra for being Odd
'XIRPX EHTXX'
>>> encrypt('THE PR', 5) # 2 Pad Characters at either end
'XXRPX EHTXX'
>>> encrypt('THE P', 5) # No Pad characters required
'PXEHT'
>>> encrypt('THE PRICE OF FREEDOM IS ETERNAL VIGILENCE', 5) #Ashwini's Example
'XXECN ELIGI VXLAN RETEX SIXMO DEERF XFOXE CIRPX EHTXX'
>>>

【讨论】:

  • +1 你计算padlength的方法比我的好很多。但是为什么不使用内置函数center呢?
  • @jamylak:哦,我太专注于计算,以至于它跳过了我的脑海。我将更改我的代码
  • 实际上center 似乎不适用于奇数...
  • 好的,所以这行得通:) 尝试将它转换为我自己的代码,但它没有,这真的激怒了我!我发誓它完全一样,只是名字不同!!谢谢你,我最终会让我的工作:)
猜你喜欢
  • 2011-03-08
  • 2021-11-12
  • 2013-09-02
  • 1970-01-01
  • 2017-03-09
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多