文字列を含むpythonリスト変数があります。1回のパスですべての文字列を小文字に、またはその逆に大文字に変換できるPython関数はありますか?
文字列を含むpythonリスト変数があります。1回のパスですべての文字列を小文字に、またはその逆に大文字に変換できるPython関数はありますか?
回答:
リスト内包表記でそれを行うことができます。これらは基本的にの形式をとり[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']
list(map(lambda x:x.upper(),["a","b","c"]))
map(str.lower, ["A","B","C"])
(多くの人にとって)読みやすくなるだけでなく、リスト内包表記もスピード競争に勝ちます:
$ 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
map
レースに勝利したが、何もしません:)
map(str.lower,["A","B","C"])
が最も速いのはpython3.7.5です
リスト内包表記は、私がそれを行う方法であり、「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']
list
変数名としては最良の選択ではありません:)
list
:))あなたが最近得たUVはどこから来たと思いますか?:)
このサンプルでは、理解度が最も速い
$ 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ミリ秒
解決:
>>> 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
。
ワンパスで変換して別の文字列と照合することを目的とする場合も使用できます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
あなたは使用してみることができます:
my_list = ['india', 'america', 'china', 'korea']
def capitalize_list(item):
return item.upper()
print(list(map(capitalize_list, my_list)))
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)
リスト内のすべての文字列を小文字に変換しようとしている場合は、パンダを使用できます:
import pandas as pd
data = ['Study', 'Insights']
pd_d = list(pd.Series(data).str.lower())
出力:
['study', 'insights']