簡體   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