繁体   English   中英

如何获取循环以忽略列表中的非字母元素?

[英]How can I get a loop to ignore non-letter elements in a list?

我有一个包含字母和标点符号的字符串。 我正在尝试用其他字母替换此字符串中的字母。 我开发的函数仅适用于包含字母的字符串。 如果包含数字,则会产生逻辑错误,如果包含标点符号,则会产生运行时错误。 无论如何,我可以让我的功能忽略标点符号并保持原样而只对字母进行操作?

#Create a string variable, ABjumbler generates an alphabet shifted by x units to the right
#ABshifter converts a string using one type to another

textObject = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
smalltext = 'abcde'

alphabet = list(['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'])

def ABjumbler(alphabet, x):
    freshset = []
    i=0
    j=0
    while i<(len(alphabet)-x):
        freshset.extend(alphabet[i+x])
        i+=1
    while j<x:
    freshset.extend(alphabet[j]) #extend [0]
    j+=1 #change j = to 1, extends by [1], then by [2], and then terminates when it reaches x
    alphabet = freshset
    return alphabet

newAlphabet = ABjumbler(alphabet, 2)

def ABshifter(text, shiftedalphabet):
    freshset = []
    for letters in text:
        position = text.index(letters)
        freshset.extend(shiftedalphabet[position])
    final = ''.join(freshset)
    return final

print ABshifter(smalltext, newAlphabet)

首先,有一些更快/更简单的方法来进行你想要的转换。

但要回答你的问题,你可以简单地添加:

if not letter.isalpha():
    continue

如果字符串仅由字母组成,则str.isalpha()返回True

试试这个:

textObject = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
smalltext = 'abcde'

alphabet = list(['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'])

def ABjumbler(alphabet, x):
    #for x greater then alphabet length
    if x>=len(alphabet):
        x = x % len(alphabet)
    #return a dictionary like 'a':'c', 'b':'d' etc
    return dict(zip(alphabet, alphabet[x:] + alphabet[:x]))

def ABshifter(letter, alph):
    if letter.isalpha():
        return alph[letter]
    return letter

print "".join(map(lambda x: ABshifter(x, ABjumbler(alphabet,2)), smalltext))

1)

x = ['a', 'b', 'c']
print x

y = list(['a', 'b', 'c'])
print y

--output:--
['a', 'b', 'c']
['a', 'b', 'c']

有什么区别? 然后在不必要的时候不要调用list()。

2)

x.append('d')
y.extend(['d'])

print x
print y

['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']

有什么区别? 如果没有必要,不要在里面创建一个带'd'的列表。

您的整个ABjumbler()函数可以减少到一行:

cypher = alphabet[x:] + alphabet[:x]

检查此代码:

import string

x = 23
letters = string.ascii_lowercase

print letters[x:]    #xyz
print letters[:x]    #abcdefghijklmnopqrstuvw
print "-" * 10

cypher = letters[x:] + letters[:x]
print cypher         #xyzabcdefghijklmnopqrstuvw

table = string.maketrans(letters, cypher)

maketrans()函数构造一个这样的转换表:

letters:  abcdefghijklmnopqrstuvwxyz
 cypher:  xyzabcdefghijklmnopqrstuvw

如果顶部的字母在字符串中找到,它们会被转换为它们正下方的字母:

x = "aaa"
print x.translate(table)   #xxx

x = 'abc'
print x.translate(table)   #xyz

x = 'a1bc!'
print x.translate(table)   #x1yz!


x = '123a-b-c!!!!a.b.c456'
print x
print x.translate(table)  

--output:--
123a-b-c!!!!a.b.c456
123x-y-z!!!!x.y.z456

如果x可能大于字母表的长度,那么写:

x = x % len(letters)

在构建密码之前。

import string

def encode_it(str_, letters, offset):
    offset = offset % len(letters)
    cypher = letters[offset:] + letters[:offset]
    table = string.maketrans(letters, cypher)
    return str_.translate(table)

您可以使用string.ascii_letters常量来检查当前字符是否为字母。 下面是替换所有字母的字符串“X”(我知道这是不是正是你想做的事,但它可能让你开始)的代码段:


    import string

    s = "g fmnc, wma: bgblr?"
    sList = list(s)

    for i in range(0, len(sList)):
        if sList[i] in string.ascii_letters
            j[i] = 'x'
        s = ''.join(j)

    print(s) #'x xxxx, xxx: xxxxx?'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM