将所有字符串都转换为小写或大写的Python列表


261

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


为什么要“一口气”?您是否考虑过多次通过的可能性?
约翰·马钦

输出需要是什么?
O.rka

Answers:


440

可以使用列表推导来完成。这些基本上采取的形式[function-of-item for item in some-list]。例如,要创建一个新列表,其中所有项目均为小写(或在第二个片段中为大写),则可以使用:

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

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

您还可以使用以下map功能:

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

12
map函数可以在python2中按预期工作,但是在python3中,您可以将地图包装在以下列表中:list(map(lambda x:x.upper(),["a","b","c"]))
Tom S

39
地图的第二个主张是正确的,但却是浪费。有在做一个lambda函数是没有意义的。只需使用map(str.lower, ["A","B","C"])
fralau

1
当我在此呼叫后尝试打印列表时,没有任何变化。这是为什么?
模拟

1
@mimic有点晚了,但是对于遇到这个问题的人来说,我猜您的问题可能是您没有将列表理解的结果分配回列表中。仅执行列表推导会返回该值,但不会将其重新分配给列表变量。
Michael Kolber

52

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

$ 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

4
您知道列表理解比map更快的原因吗?
Nixuz

6
它并不总是更快。这是一个没有的示例:stackoverflow.com/questions/1247486/… 但是在这种情况下,它并没有慢很多。使用lambda显然有很大的不同。还有更多示例说明为什么对性能问题信任直觉是危险的,尤其是在Python中。
内德·迪利2009年

3
在python 3中map赢得比赛,但无能为力:)
让·弗朗索瓦·法布尔

@NedDeily map(str.lower,["A","B","C"])最快的是python3.7.5
SHIVAM JINDAL


20

列表理解是我要做的,这是“ 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']

2
错了,使用list作为变量名是不是最好的选择:)
让·弗朗索瓦·法布尔

不,但是,由于名称与所显示的方法无关紧要,因此它实际上并不相关。但是,如果有人想按原样使用代码,我将更改名称。
paxdiablo

stackoverflow的魔力:250票赞成使用lambda的python 2 only解决方案,不应该这样做!249口井
让·弗朗索瓦·法布尔

@Jean-FrançoisFabre,不确定您为什么认为这是仅限Python-2的解决方案。如成绩单所示,它显然在Python 3.5.2下运行。实际上,我只是再次检查以确认。...经过一段时间调查之后...其实,没关系,看来您是在谈论当前接受的答案,而不是这个,所以您可能应该在这里而不是在这里发表评论。毫无疑问,这是一个诚实的错误。干杯。
paxdiablo

1
是的,我不是在批评您的(除了这些list东西:))。您认为您最近得到的紫外线来自哪里?:)
让·弗朗索瓦·法布尔

7

对于此样本,理解最快

$ python -m timeit -s's = [“一个”,“两个”,“三个”] * 1000''[x.s中x的x.upper]
1000次循环,最好是3次:每个循环809微秒

$ python -m timeit -s's = [“一个”,“两个”,“三个”] * 1000''map(str.upper,s)'
1000次循环,每循环3:1.12毫秒的最佳时间

$ python -m timeit -s's = [“一个”,“两个”,“三个”] * 1000''map(lambda x:x.upper(),s)'
1000个循环,每个循环最好3:1.77毫秒

5

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

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

3
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)))

2

解:

>>> 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 plist s它将保留该项目的大小写并将其保持为小写。现在,您可以使用list s代替list p


1

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

(:集体VS集体EG).Though当你有非ASCII字符和匹配使用ASCII版本,这是有用str.lower还是str.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

1

@Amorpheuses 在此处给出了最简单答案的顶级答案。

带有val中的值列表:

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

对于f = open()文本源,这对我来说效果很好。


1

您可以尝试使用:

my_list = ['india', 'america', 'china', 'korea']

def capitalize_list(item):
    return item.upper()

print(list(map(capitalize_list, my_list)))

0

的Python3.6.8

In [1]: a = 'which option is the fastest'                                                                                                                                           

In [2]: %%timeit 
   ...: ''.join(a).upper() 
762 ns ± 11.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [3]: %%timeit  
   ...: map(lambda x:x.upper(), a) 
209 ns ± 5.73 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [4]: %%timeit  
   ...: map(str.upper, [i for i in a]) 
1.18 µs ± 11.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [5]: %%timeit 
   ...: [i.upper() for i in a] 
3.2 µs ± 64.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

如果您需要一个字符串或列表作为输出而不是一个迭代器(这是针对Python3的),则可以使用compare ''.join(string).upper()选项:

In [10]: %%timeit  
    ...: [i for i in map(lambda x:x.upper(), a)] 
4.32 µs ± 112 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

0

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

import pandas as pd

data = ['Study', 'Insights']

pd_d = list(pd.Series(data).str.lower())

输出:

['study', 'insights']
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.