문자열이 모두 포함 된 Python 목록을 소문자 또는 대문자로 변환


261

문자열을 포함하는 파이썬 목록 변수가 있습니다. 한 번에 모든 문자열을 소문자로 또는 그 반대로 대문자로 변환 할 수있는 파이썬 함수가 있습니까?


왜 "한 번에"? 여러 번 패스 할 가능성을 생각하십니까?
John Machin

결과물은 무엇입니까?
O.rka

답변:


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
지도 함수는 python2에서 예상대로 작동하지만 python3에서는 예를 목록으로 래핑해야합니다.list(map(lambda x:x.upper(),["a","b","c"]))
Tom S

39
지도 와 함께 두 번째 제안 은 정확하지만 낭비입니다. 람다 함수를 만드는 데는 아무런 의미없습니다 . 그냥 사용하십시오map(str.lower, ["A","B","C"])
fralau

1
이 호출 후 목록을 인쇄하려고하면 아무것도 변경되지 않습니다. 왜 그런 겁니까?
모방

1
@mimic 조금 늦었지만이 문제를 겪고있는 사람들에게는 목록 이해 결과를 목록에 다시 할당하지 않았기 때문일 수 있습니다. 목록 이해를 수행하면 값이 반환되지만 목록 변수에 다시 할당하지는 않습니다.
Michael Kolber 2014 년

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
목록 이해가지도보다 더 빠른 이유를 알고 있습니까?
Nixuz

6
항상 빠르지는 않습니다. 이것이 아닌 예는 다음과 같습니다. stackoverflow.com/questions/1247486/… 그러나이 경우에는 그다지 느리지 않습니다 . 람다를 사용하면 분명히 큰 차이가 있습니다. 특히 파이썬에서 성능 문제에 대한 직감을 신뢰하는 것이 위험한 이유에 대한 더 많은 예가 있습니다.
Ned Deily

3
python 3 map에서 레이스
Jean-François Fabre

@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
err, list변수 이름으로 사용 하는 것이 최선의 선택은 아닙니다 :)
Jean-François Fabre

아니요, 이름은 표시되는 방법에 거의 중요하지 않으므로 실제로 관련이 없습니다. 그러나 누군가 코드를 그대로 사용하려는 경우 이름을 변경합니다.
paxdiablo

stackoverflow의 마술 : 람다를 사용하지 말아야하는 파이썬 2 전용 솔루션에 250 투표! well 249 now
Jean-François Fabre

@ Jean-FrançoisFabre, 이것이 왜 이것이 파이썬 2 전용 솔루션이라고 생각하는지 확실하지 않습니다. 성적표에서 알 수 있듯이 Python 3.5.2 에서는 분명히 실행됩니다. 사실 확인을 위해 다시 확인했습니다. 당신은 아마 의견을해야한다, 그래서 나는, 사실, 당신이 현재 허용 대답이 아니라이 일에 대해 얘기했다 표시, 결코 마음을 ... 조사하면서 ... 약간의 시간이 통과 여기보다는. 의심 할 여지없이 정직한 실수입니다. 건배.
paxdiablo

1
예, 나는 당신의 것을 비판하지 않았습니다 ( list물건 제외 ). 최근에 얻은 UV는 어디에서 왔을까요? :)
Jean-François Fabre

7

이 샘플에서는 이해력이 가장 빠릅니다.

$ python -m timeit -s 's = [ "one", "two", "three"] * 1000' '[x.s in x in s]' '
루프 당 1000 루프, 3 : 3 : 809 usec

$ python -m timeit -s 's = [ "one", "two", "three"] * 1000' 'map (str.upper, s)'
1000 루프, 루프 당 3 : 1.12 msec 최고

$ python -m timeit -s 's = [ "one", "two", "three"] * 1000' 'map (lambda x : x.upper (), s)'
1000 루프, 루프 당 3 : 1.77 msec 최고

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 p다음은 list s항목의 경우를 유지하고는 소문자로 유지한다. 이제 list s대신 사용할 수 있습니다 list p.


1

한 번의 패스로 변환하여 다른 문자열과 일치시키는 것이 목적이라면 사용할 수도 있습니다 str.casefold().

이것은 ASCII 이외의 문자가 있고 ASCII 버전과 일치하는 경우에 유용합니다 (예 : maße vs masse) . 이러한 경우에 실패 str.lower하거나 통과 할 수 있습니다. 이것은 Python 3에서 사용할 수 있으며 아이디어는 https://stackoverflow.com/a/31599276/4848659 답변과 함께 자세히 설명됩니다 .str.upperstr.casefold()

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

파이썬 3.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의 경우) ''.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']
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.