文字列を含むPythonリストをすべて小文字または大文字に変換する


261

文字列を含むpythonリスト変数があります。1回のパスですべての文字列を小文字に、またはその逆に大文字に変換できるPython関数はありますか?


なぜ「ワンパスで」?あなたはそれが複数のパスを取る可能性を考えていますか?
John Machin、

出力は何である必要がありますか?
O.rka

回答:


440

リスト内包表記でそれを行うことができます。これらは基本的にの形式をとり[function-of-item for item in some-list]ます。たとえば、すべてのアイテムが小文字(または2番目のスニペットでは大文字)である新しいリストを作成するには、次のようにします。

>>> [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"]))
トム・S

39
マップを使用した 2番目の命題は正しいですが、無駄です。ラムダ関数を作成しても意味がありません。使用するだけ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
リストの理解がマップよりも速い理由の理由を知っていますか?
Nixuz、2009年

6
常に速いとは限りません。そうでない例を次に示します。stackoverflow.com / questions / 1247486 / …しかし、その場合はそれほど遅くありません。ラムダを使用すると、明らかに大きな違いが生まれます。特にPythonで、パフォーマンスの問題に関する直感を信頼することが危険である理由の例が他にもあります。
Ned Deily、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
errは、使用するlist変数名としては最良の選択ではありません:)
ジャン=フランソワ・ファーブル

いいえ、ただし、この名前は表示されているメソッドにとってあまり重要ではないため、あまり関係ありません。ただし、コードをそのまま使用したい場合に備えて、名前を変更します。
paxdiablo

Stackoverflowの魔法:ラムダを使用してはならない場所でPython 2のみのソリューションに250票!! さて249今
ジャン=フランソワ・ファーブル

@Jean-FrançoisFabre、これがPython-2のみのソリューションであると考える理由がわかりません。文字起こしが示すように、それは明らかにPython 3.5.2で実行されています。実際、確認のためにもう一度チェックしました。...調査中、時間が経過します...実際、気にしないでください。あなたがこれではなく、現在受け入れられている回答について話していたようです。おそらくここはなく、そこにコメントする必要があります。間違いなく正直な間違いです。乾杯。
paxdiablo 2018年

1
ええ、私はあなたのものを批判していませんでした(ものを除いてlist:))あなたが最近得たUVはどこから来たと思いますか?:)
ジャン・フランソワ・ファーブル

7

このサンプルでは、​​理解度が最も速い

$ python -m timeit -s 's = ["one"、 "two"、 "three"] * 1000' '[x.upper for x in s]'
1000ループ、ベスト3:ループあたり809 usec

$ 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ミリ秒

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文字と一致していたときに便利です(例:マッセ一斉VS).Though 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の場合)、''.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

リスト内のすべての文字列を小文字に変換しようとしている場合は、パンダを使用できます:

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.