2011-10-04 50 views
0

我有蟒蛇名單,我想重複和把握每一個字母,是不是「A」,所以把該名單:迭代Python列表和利用特定的字母

['albert', 'angela', 'leo', 'bridget'] 

分爲:

['aLBERT', 'aNGELa', 'LEO', 'BRIDGET'] 
+0

我建議你看看鄧肯的回答,因爲我相信這將是一個大名單上要好得多。事實上,就在你的名單上,他的答案几乎快了6倍,經過測試,具有timeit模塊 – pyInTheSky

+0

@jwesonga:你能指定如何處理字母'a'和'A'嗎?事實上,有些答案將'阿爾伯塔'轉變爲'阿爾伯塔',而另一些則將其轉化爲'阿爾伯塔'。 – EOL

+0

也可以說你想用重音字母做什麼? – Duncan

回答

3

現有的答案似乎都希望在字符單獨操作。它是簡單和容易只是處理的話作爲一個整體:

>>> the_list = ['albert', 'angela', 'leo', 'bridget'] 
>>> [ word.upper().replace('A', 'a') for word in the_list] 
['aLBERT', 'aNGELa', 'LEO', 'BRIDGET'] 
+0

即將發佈此信息。我認爲它比其他答案要好,因爲它呼叫的方式少,條件不好。 – pyInTheSky

+3

除非你有'艾伯特',並且你希望它變成'ALBERT'而不是'aLBERT'。但是從例子中不清楚是否允許大寫字母開頭。 (而且我的答案並不是單獨對字符進行操作,甚至使用比這個更少的函數調用,@pyInTheSky,n + 3而不是n * 2,儘管它不適用於非ASCII字符。) – agf

+0

非常不錯,我以前用過它,但不知道它是那麼快 – pyInTheSky

4
[''.join(c.upper() if c != 'a' else c for c in word) for word in the_list] 
+0

@EOL:我認爲使用'map'功能的解決方案可能會更簡單,但不會太多.. –

+0

@machineyearning每次有人說地圖比理解更好時,閃電擊中了一隻小貓...只是說 – JBernardo

+1

@EOL:簡單就是'[word.upper()。替換('A','a')for_list]中的單詞。這可以將「Adam」轉換爲「aDaM」。 –

0

的不雅方法很簡單

lst = ['albert', 'angela', 'leo', 'bridget'] 
    lst2 = [] 

    for wrd in lst: 
     newwrd = '' 
     for ltr in wrd: 
      if ltr != 'a': 
       newwrd += ltr.upper() 
      else: newwrd += ltr 
     lst2.append(newwrd) 

但是名單complrehensions會更Python

lst = ['albert', 'angela', 'leo', 'bridget'] 
[''.join(ltr.upper() if ltr != 'a' else 'a' for ltr in wrd) for wrd in lst] 

這實質上嵌套列表內涵代替嵌套循環。 這是一個更簡潔的解決方案,更容易理解

列表理解是一個表達式(ltr.upper()if ltr =='a')後跟「for」,然後是選項if子句。在這裏我們有兩個(我看@JBernardo做了同樣的事情),它們的行爲方式與嵌套for循環相同。

我希望能幫助解釋這些差異。

1
>>> import re 
>>> sl = ['albert', 'angela', 'leo', 'bridget'] 
>>> [re.sub('[^a]+', lambda m: m.group(0).upper(), s) for s in sl] 
['aLBERT', 'aNGELa', 'LEO', 'BRIDGET'] 
+0

這不適用於重音字母... – EOL

+1

也許這不是@EOL。正則表達式 - 這取決於。在thouzands字符串中,正則表達式比JBernardo的解決方案快幾倍(可以用'timeit'來檢查)。他們也是最靈活的,以防任務變得更加複雜,然後只是「一個或一個」。 – hamstergene

+0

+1:顯式和高效(在長字符串上)。 – EOL

1

這是str.translate是:

import string 

table = string.maketrans(string.ascii_lowercase.replace('a', ''), 
          string.ascii_uppercase.replace('A', '')) 

names = ['albert', 'angela', 'leo', 'bridget'] 

print [name.translate(table) for name in names] 

translate花費256字符表,讓你用string.maketrans把代表小寫和大寫字母爲表string constants。任何未出現在表格中的字母都將被忽略,因此刪除aA將會大寫所有其他字母。

然後只需將轉換表應用到列表中的每個名稱。

它會比遍歷每個名​​稱更快,並且每個字母都會調用upper,但是每個字母都會更快,但是a。雖然通用的Python工具使這一切變得簡單,但這是專門爲此工作制作的工具。

+1

聰明,但不會像'áéüâõ'(如果需要)的字母。 – JBernardo

+0

只是出於curiocity,可以更改'string.ascii_ *'常量嗎? – ronakg

+0

@RonakG字符串是不可變的,你不能改變它們。所有'replace'都會返回一個替換了子字符串的新字符串。 – agf

0

如果你想從事的函數式編程範式多一點:

def maybe_upper(c, u): 
    return c.upper() if c in u else c 

def some_upper(s, u): 
    return ''.join(map(lambda c: maybe_upper(c, u), s)) 

>>> some_upper("wahwahweeeewagh", 'uea') 
'wAhwAhwEEEEwAgh'