Dizeleri içeren bir python listesi değişkeni var. Bir dizideki tüm dizeleri küçük harfe ve tersi büyük harfe dönüştürebilen bir python işlevi var mı?
Dizeleri içeren bir python listesi değişkeni var. Bir dizideki tüm dizeleri küçük harfe ve tersi büyük harfe dönüştürebilen bir python işlevi var mı?
Yanıtlar:
Liste kavrayışı ile yapılabilir. Bunlar temelde [function-of-item for item in some-list]
. Örneğin, tüm öğelerin alt kasalı (veya ikinci snippet'te üst kasalı) yeni bir liste oluşturmak için şunu kullanırsınız:
>>> [x.lower() for x in ["A","B","C"]]
['a', 'b', 'c']
>>> [x.upper() for x in ["a","b","c"]]
['A', 'B', 'C']
Ayrıca bu map
işlevi kullanabilirsiniz :
>>> 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"])
Okuması daha kolay olmasının yanı sıra (birçok kişi için) liste anlaşmaları da hız yarışını kazanıyor:
$ 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
yarışı kazanır, ama hiçbir şey yapmaz :)
map(str.lower,["A","B","C"])
en hızlı python3.7.5
>>> map(str.lower,["A","B","C"])
['a', 'b', 'c']
str.upper
büyük harfe dönüştürmek
Liste anlama, bunu nasıl yapacağımı, "Pythonic" yoludur. Aşağıdaki konuşma metni, bir listenin büyük harfe nasıl dönüştürüleceğini gösterir.
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
değişken adı olarak kullanmak en iyi seçim değildir :)
list
eşyaların dışında :)) Son zamanlarda aldığın UV'nin nereden geldiğini düşünüyorsun? :)
Bu örnek için anlama en hızlıdır
$ python -m timeit -s 's = ["bir", "iki", "üç"] * 1000' '[x, s için x için üst]' 1000 döngü, döngü başına en iyi 3: 809 usec $ python -m timeit -s 's = ["bir", "iki", "üç"] * 1000' 'harita (str.upper, s)' 1000 döngü, döngü başına en iyi 3: 1,12 ms $ python -m timeit -s 's = ["bir", "iki", "üç"] * 1000' 'harita (lambda x: x.upper (), s)' 1000 döngü, döngü başına en iyi 3: 1,77 msn
Çözüm:
>>> 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']
Bu çözüm, orijinal durumlarına bakılmaksızın küçük harf öğeleri içeren ayrı bir liste oluşturur. Orijinal kutu daha büyükse, list s
ilgili öğenin küçük harfini içerecektir list p
. Liste öğesinin orijinal durumda zaten küçük harf ise list p
o zaman list s
öğenin davasını sürdürecek ve küçük harflerle tutun. Şimdi list s
yerine kullanabilirsiniz list p
.
Amacınız bir geçişte başka bir dizeyle eşleştirmekse de kullanabilirsiniz str.casefold()
.
Bu, ascii olmayan karakterleriniz varsa ve ascii sürümleriyle eşleştiğinizde yararlıdır (örneğin: maße vs masse) .Bu durumlarda str.lower
da str.upper
başarısız olur str.casefold()
. Bu Python 3'te mevcuttur ve fikir https://stackoverflow.com/a/31599276/4848659 cevabı ile ayrıntılı olarak tartışılmaktadır .
>>>str="Hello World";
>>>print(str.lower());
hello world
>>>print(str.upper());
HELLO WOLRD
>>>print(str.casefold());
hello world
Kullanmayı deneyebilirsiniz:
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)
Çıktı olarak yineleyiciye değil bir dizeye veya listeye ihtiyacınız varsa (bu Python3 içindir), ''.join(string).upper()
seçeneği aşağıdakilerle karşılaştırın :
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)
Listedeki tüm dizeleri küçük harfe dönüştürmeye çalışıyorsanız, pandaları kullanabilirsiniz:
import pandas as pd
data = ['Study', 'Insights']
pd_d = list(pd.Series(data).str.lower())
çıktı:
['study', 'insights']