【问题标题】:Convert a list with strings all to lowercase or uppercase将包含字符串的列表全部转换为小写或大写
【发布时间】:2023-04-01 23:35:01
【问题描述】:

我有一个包含字符串的 Python 列表变量。是否有一个函数可以一次将所有字符串转换为小写,反之亦然,大写?

【问题讨论】:

  • 为什么是“一次性”?您是否考虑过多次通过的可能性?

标签: python list


【解决方案1】:

可以用list comprehensions完成

>>> [x.lower() for x in ["A", "B", "C"]]
['a', 'b', 'c']
>>> [x.upper() for x in ["a", "b", "c"]]
['A', 'B', 'C']

map function

>>> list(map(lambda x: x.lower(), ["A", "B", "C"]))
['a', 'b', 'c']
>>> list(map(lambda x: x.upper(), ["a", "b", "c"]))
['A', 'B', 'C']

【讨论】:

  • map 的第二个命题是正确的但很浪费。 制作 lambda 函数没有意义。只需使用map(str.lower, ["A","B","C"])
  • 当我在此调用后尝试打印列表时,没有任何变化。这是为什么呢?
  • @mimic 有点晚了,但是对于遇到这个问题的人来说,我猜您的问题可能是您没有将列表理解的结果分配回您的列表。只是对列表推导返回值,但不会将其重新分配给列表变量。
  • 两者之间最快的是什么? (列表理解与地图)
【解决方案2】:
>>> list(map(str.lower,["A","B","C"]))
['a', 'b', 'c']

【讨论】:

  • 显然str.upper 转换为大写
  • 在 Python 3 中,您需要将生成的映射传递给列表函数以获得所需的结果,即list(map(str.lower,["A","B","C"]))
【解决方案3】:

除了更易于阅读(对于许多人而言)之外,列表推导式还赢得了速度竞赛:

$ python2.6 -m timeit '[x.lower() for x in ["A","B","C"]]'
1000000 loops, best of 3: 1.03 usec per loop
$ python2.6 -m timeit '[x.upper() for x in ["a","b","c"]]'
1000000 loops, best of 3: 1.04 usec per loop

$ python2.6 -m timeit 'map(str.lower,["A","B","C"])'
1000000 loops, best of 3: 1.44 usec per loop
$ python2.6 -m timeit 'map(str.upper,["a","b","c"])'
1000000 loops, best of 3: 1.44 usec per loop

$ python2.6 -m timeit 'map(lambda x:x.lower(),["A","B","C"])'
1000000 loops, best of 3: 1.87 usec per loop
$ python2.6 -m timeit 'map(lambda x:x.upper(),["a","b","c"])'
1000000 loops, best of 3: 1.87 usec per loop

【讨论】:

  • 你知道列表理解比地图快的原因吗?
  • 它并不总是更快。下面是一个不是这样的示例:stackoverflow.com/questions/1247486/… 但在这种情况下它并没有很多慢。使用 lambda 显然会产生很大的不同。有更多示例说明为什么在性能问题上相信直觉是危险的,尤其是在 Python 中。
  • 在 python 3 中,map 赢得了比赛,但什么也没做 :)
  • @NedDeily map(str.lower,["A","B","C"]) 最快的是python3.7.5
  • @SHIVAMJINDAL 因为map 除了创建一个对象,当您对其进行迭代 时,它不会执行任何操作.lower()。如果您尝试list(map()),它会更慢。正如让-弗朗索瓦所说。
【解决方案4】:

@Amorpheuses 给出了一个更简单的最佳答案版本here

在 val 中有一个值列表:

valsLower = [item.lower() for item in vals]

这对我来说很适合 f = open() 文本源。

【讨论】:

    【解决方案5】:
    mylist = ['Mixed Case One', 'Mixed Case Two', 'Mixed Three']
    print(list(map(lambda x: x.lower(), mylist)))
    print(list(map(lambda x: x.upper(), mylist)))
    

    【讨论】:

      【解决方案6】:

      列表理解是我的做法,它是“Pythonic”的方式。以下脚本显示了如何将列表全部转换为大写,然后再转换为小写:

      pax@paxbox7:~$ python3
      Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
      [GCC 5.4.0 20160609] on linux
      Type "help", "copyright", "credits" or "license" for more information.
      
      >>> x = ["one", "two", "three"] ; x
      ['one', 'two', 'three']
      
      >>> x = [element.upper() for element in x] ; x
      ['ONE', 'TWO', 'THREE']
      
      >>> x = [element.lower() for element in x] ; x
      ['one', 'two', 'three']
      

      【讨论】:

      • err,使用list 作为变量名不是最好的选择:)
      • 不,但是,由于名称对于所显示的方法并不重要,因此它并不真正相关。但是,如果有人想按原样使用代码,我会更改名称。
      • stackoverflow 的魔力:250 票支持使用 lambda 的仅 python 2 解决方案,而它不应该!现在 249 井
      • @Jean-FrançoisFabre,不知道为什么你认为这是一个仅限 Python-2 的解决方案。正如成绩单所示,它显然在 Python 3.5.2 下运行。事实上,我只是再次检查了它以确认。 ...在我调查时过了一段时间...实际上,没关系,您似乎在谈论当前接受的答案而不是这个答案,所以您可能应该评论 there 而不是here。毫无疑问,这是一个诚实的错误。干杯。
      • 是的,我没有批评你的(除了list 的东西:))。你认为你最近得到的紫外线来自哪里? :)
      【解决方案7】:

      如果您的目的是通过一次转换来匹配另一个字符串,您也可以使用str.casefold()

      当您有非 ascii 字符并与 ascii 版本匹配(例如:maße vs masse)时,这很有用。尽管str.lowerstr.upper 在这种情况下失败,str.casefold() 将通过。 这在 Python 3 中可用,这个想法在答案https://stackoverflow.com/a/31599276/4848659 中进行了详细讨论。

      >>>str="Hello World";
      >>>print(str.lower());
      hello world
      >>>print(str.upper());
      HELLO WOLRD
      >>>print(str.casefold());
      hello world
      

      【讨论】:

        【解决方案8】:

        您可以尝试使用:

        my_list = ['india', 'america', 'china', 'korea']
        
        def capitalize_list(item):
            return item.upper()
        
        print(list(map(capitalize_list, my_list)))
        

        【讨论】:

          【解决方案9】:

          对于这个示例,理解是最快的

          $ python -m timeit -s 's=["one","two","three"]*1000' '[x.upper for x in s]' 1000 个循环,最好的 3 个:每个循环 809 微秒 $ python -m timeit -s 's=["one","two","three"]*1000' 'map(str.upper,s)' 1000 次循环,3 次中的最佳:每个循环 1.12 毫秒 $ python -m timeit -s 's=["one","two","three"]*1000' 'map(lambda x:x.upper(),s)' 1000 次循环,3 次中的最佳:每循环 1.77 毫秒

          【讨论】:

            【解决方案10】:

            一个学生提问,另一个学生回答同样的问题:))

            fruits=['orange', 'grape', 'kiwi', 'apple', 'mango', 'fig', 'lemon']
            newList = []
            for fruit in fruits:
                newList.append(fruit.upper())
            print(newList)
            

            【讨论】:

              【解决方案11】:

              解决方案:

              >>> s = []
              >>> p = ['This', 'That', 'There', 'is', 'apple']
              >>> [s.append(i.lower()) if not i.islower() else s.append(i) for i in p]
              >>> s
              >>> ['this', 'that', 'there', 'is','apple']
              

              此解决方案将创建一个包含小写项目的单独列表,无论它们的原始大小写如何。如果原始大小写为大写,则list s 将包含list p 中相应项目的小写。如果列表项的原始大小写在list p 中已经是小写,那么list s 将保留该项的大小写并将其保持为小写。现在您可以使用list s 代替list p

              【讨论】:

                【解决方案12】:

                如果您尝试将列表中的所有字符串转换为小写,您可以使用 pandas :

                import pandas as pd
                
                data = ['Study', 'Insights']
                
                pd_d = list(pd.Series(data).str.lower())
                

                输出:

                ['study', 'insights']
                

                【讨论】:

                  猜你喜欢
                  • 2016-01-22
                  • 2017-05-18
                  • 2018-09-07
                  • 2010-09-14
                  • 1970-01-01
                  • 2012-01-08
                  • 2016-06-06
                  • 1970-01-01
                  • 2010-11-04
                  相关资源
                  最近更新 更多