2011-10-04 46 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'