Dizeleri olan bir Python listesini küçük veya büyük harfe dönüştürme


262

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


Neden "bir geçişte"? Birden fazla geçiş yapma olasılığını düşünüyor musunuz?
John Machin

Çıktının ne olması gerekiyor?
O.rka

Yanıtlar:


441

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 mapişlevi kullanabilirsiniz :

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

12
Harita işlevi python2'de beklendiği gibi çalışır, ancak python3'te haritayı bir listeye sarmanız gerekir:list(map(lambda x:x.upper(),["a","b","c"]))
Tom S

39
Harita ile ikinci öneri doğru ama israf. Orada bir lambda fonksiyonu yapımında hiçbir anlamı . Sadece kullanınmap(str.lower, ["A","B","C"])
fralau

1
Bu çağrıdan sonra bir liste yazdırmaya çalıştığımda hiçbir şey değişmiyor. Neden?
mimik

1
Biraz geç, ancak bununla karşılaşan insanlar için, sorununuzu muhtemelen liste kavrayışının sonucunu listenize atamadığınız anlamına geliyordu. Sadece liste kavraması yapmak değeri döndürür, ancak liste değişkenine yeniden atamaz.
Michael Kolber

52

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

4
Bir liste kavramasının haritadan daha hızlı olmasının nedenini biliyor musunuz?
Nixuz

6
Her zaman daha hızlı değil. İşte olmadığı bir örnek: stackoverflow.com/questions/1247486/… Ancak bu durumda çok daha yavaş değil . Bir lambda kullanmak kesinlikle büyük bir fark yaratıyor. Özellikle Python'da performans sorunları hakkındaki sezginize güvenmenin neden tehlikeli olduğuna dair daha fazla örnek var.
Ned Deily

3
python 3'te mapyarışı kazanır, ama hiçbir şey yapmaz :)
Jean-François Fabre

@NedDeily map(str.lower,["A","B","C"])en hızlı python3.7.5
SHIVAM JINDAL


20

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

2
err, listdeğişken adı olarak kullanmak en iyi seçim değildir :)
Jean-François Fabre

Hayır, ancak ad, gösterilen yöntem için çok az önemli olduğundan, gerçekten alakalı değildir. Ancak, birinin kodu olduğu gibi kullanmak istemesi durumunda adı değiştireceğim.
paxdiablo

stackoverflow büyüsü: değil gerekir lambda kullanarak 2 python sadece bir çözüm için 250 oy !! 249 şimdi
Jean-François Fabre

@ Jean-FrançoisFabre, bunun neden sadece Python-2 çözümü olduğunu düşündüğünüzden emin değilim. Transkriptlerin gösterdiği gibi, Python 3.5.2 altında açıkça çalışıyor. Aslında, sadece onay için tekrar kontrol ettim . Muhtemelen yorumlama gerektiğini yüzden Aslında, mevcut kabul cevap ziyade bu bir bahsediyorduk görünür aldırma ... konuyu araştırırken ... biraz zaman geçer orada burada yerine. Şüphesiz dürüst bir hata. Şerefe.
paxdiablo

1
evet, seninkini eleştirmedim ( listeşyaların dışında :)) Son zamanlarda aldığın UV'nin nereden geldiğini düşünüyorsun? :)
Jean-François Fabre

7

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

5

diye sordu bir öğrenci, aynı problemi cevaplayan başka bir öğrenci :))

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

Çö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 silgili öğenin küçük harfini içerecektir list p. Liste öğesinin orijinal durumda zaten küçük harf ise list po zaman list söğenin davasını sürdürecek ve küçük harflerle tutun. Şimdi list syerine kullanabilirsiniz list p.


1

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.lowerda str.upperbaş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

1

Üst Yanıta çok daha basit bir sürümü verilir burada @Amorpheuses tarafından.

Val içindeki değerlerin bir listesiyle:

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

Bu f = open () metin kaynağı ile benim için iyi çalıştı.


1

Kullanmayı deneyebilirsiniz:

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)

Çı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)

0

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']
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.