【问题标题】:Iterate python list and capitalize specific letters迭代python列表并将特定字母大写
【发布时间】:2011-10-04 13:44:31
【问题描述】:

我在 python 中有一个列表,我想迭代并大写每个不是“A”的字母,所以打开这个列表:

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

进入:

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

【问题讨论】:

  • 我建议你看看 Duncan 的回答,因为我相信在大名单上会好得多。事实上,就在你的名单上,他的答案几乎快了 6 倍,正如使用 timeit 模块测试的那样
  • @jwesonga:你能指定如何处理字母“a”和“A”吗?事实上,一些答案将“Alberta”转换为“ALBERTA”,而另一些则将其转换为“aLBERTA”。
  • 你也能说出你想用重音字母做什么吗?

标签: python list


【解决方案1】:
[''.join(c.upper() if c != 'a' else c for c in word) for word in the_list]

【讨论】:

  • @EOL:我认为使用map 函数的解决方案可能更简单,但不会简单很多..
  • @machineyearning 每当有人说地图胜于理解时,一只小猫就会被闪电击中......只是说
  • @EOL:更简单的是[word.upper().replace('A','a') for word in the_list]。这很有效,因为可以将 'Adam' 转换为 'aDaM'。
  • @StevenRumbalski 为了赢得代码高尔夫挑战,我会走得更远:eval(str(the_list).upper().replace('A','a')):D
  • @StevenRumbalski 我知道,但不确定将“Adam”变成“aDaM”是否可以...
【解决方案2】:

所有现有的答案似乎都想单独对字符进行操作。将单词作为一个整体处理更简单,更容易:

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

【讨论】:

  • 正要发布这个。我认为它比其他答案更好,因为它的调用次数更少而且没有 if 条件
  • 除非你有Albert并且你希望它变成ALBERT而不是aLBERT。但是从例子中并不清楚是否允许以大写字母开头。 (而且我的答案不是单独对字符进行操作,甚至使用的函数调用比@pyInTheSky,n+3 而不是 n*2 更少,尽管它不适用于非 ASCII 字符。)跨度>
  • 很不错,以前用过不知道这么快
【解决方案3】:

这就是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 会将所有其他字母大写。

然后只需将翻译表应用于列表中的每个名称。

这将比遍历每个名​​称并在除a 之外的每个字母上调用upper 更快。虽然通用 Python 工具可以轻松完成这项工作,但这是专门为这项工作设计的工具。

【讨论】:

  • 智能,但不适用于áéüâõ 之类的字母(如果需要)。
  • 只是出于好奇,改string.ascii_*常量可以吗?
  • @RonakG 字符串是不可变的,您无法更改它们。 replace 所做的只是返回一个替换了子字符串的新字符串。
  • @agf 如果区域设置正确
  • @agf 乱码是您的终端无法正常显示的大写版本
【解决方案4】:
>>> 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']

【讨论】:

  • 也许不是@EOL。正则表达式——这取决于。在数千个字符的字符串上,正则表达式将比 JBernardo 的解决方案快几倍(您可以使用 timeit 进行检查)。它们也是最灵活的,以防任务变得比“a or not a”更复杂。
【解决方案5】:

不优雅的方式很简单

  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)

但是列表的理解会更 Pythonic

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 循环相同。

我希望这有助于解释这些差异。

【讨论】:

    【解决方案6】:

    如果您想更多地使用函数式编程范式:

    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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      相关资源
      最近更新 更多