Konversikan daftar Python dengan string semua menjadi huruf kecil atau huruf besar


261

Saya memiliki variabel daftar python yang berisi string. Apakah ada fungsi python yang dapat mengubah semua string dalam satu pass menjadi huruf kecil dan sebaliknya, huruf besar?


Mengapa "dalam satu pass"? Apakah Anda merenungkan kemungkinan mengambil beberapa lintasan?
John Machin

Apa yang perlu menjadi output?
O.rka

Jawaban:


440

Ini dapat dilakukan dengan daftar pemahaman. Ini pada dasarnya berbentuk [function-of-item for item in some-list]. Misalnya, untuk membuat daftar baru di mana semua item menggunakan huruf kecil (atau huruf besar dalam potongan kedua), Anda akan menggunakan:

>>> [x.lower() for x in ["A","B","C"]]
['a', 'b', 'c']

>>> [x.upper() for x in ["a","b","c"]]
['A', 'B', 'C']

Anda juga dapat menggunakan mapfungsi ini:

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

12
Fungsi peta berfungsi seperti yang diharapkan di python2, namun dalam python3 Anda membungkus peta dalam daftar, misalnya:list(map(lambda x:x.upper(),["a","b","c"]))
Tom S

39
Proposisi kedua dengan peta benar tetapi boros. Tidak ada gunanya membuat fungsi lambda . Cukup gunakanmap(str.lower, ["A","B","C"])
fralau

1
Ketika saya mencoba untuk mencetak daftar setelah panggilan ini tidak ada yang berubah. Mengapa demikian?
meniru

1
@ Mimic Agak terlambat, tetapi untuk orang-orang yang menemukan ini, saya kira masalah Anda mungkin karena Anda tidak menugaskan hasil pemahaman daftar kembali ke daftar Anda. Hanya melakukan ke daftar pemahaman mengembalikan nilai, tetapi tidak menugaskannya kembali ke variabel daftar.
Michael Kolber

52

Selain lebih mudah dibaca (bagi banyak orang), pemahaman daftar juga memenangkan perlombaan cepat:

$ 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
Apakah Anda tahu alasan di balik mengapa pemahaman daftar lebih cepat daripada peta?
Nixuz

6
Itu tidak selalu lebih cepat. Berikut adalah contoh di mana tidak: stackoverflow.com/questions/1247486/… Tapi itu tidak jauh lebih lambat dalam kasus itu. Menggunakan lambda jelas membuat perbedaan besar. Ada lebih banyak contoh mengapa berbahaya mempercayai intuisi Anda tentang masalah kinerja, terutama dengan Python.
Ned Deily

3
dalam python 3, mapmemenangkan perlombaan, tetapi tidak melakukan apa-apa :)
Jean-François Fabre

@NedDeily map(str.lower,["A","B","C"])tercepat adalah python3.7.5
SHIVAM JINDAL


20

Pemahaman daftar adalah bagaimana saya melakukannya, itu adalah cara "Pythonic". Transkrip berikut menunjukkan cara mengonversi daftar ke semua huruf besar kemudian kembali ke bawah:

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, menggunakan listsebagai nama variabel bukan pilihan terbaik :)
Jean-François Fabre

Tidak, tetapi karena namanya tidak terlalu penting untuk metode yang ditampilkan, itu tidak benar-benar relevan. Namun, saya akan mengubah nama jika seseorang ingin menggunakan kode apa adanya.
paxdiablo

keajaiban stackoverflow: 250 suara untuk solusi python 2-satunya menggunakan lambda di mana seharusnya tidak !! baik 249 sekarang
Jean-François Fabre

@ Jean-FrançoisFabre, tidak yakin mengapa Anda berpikir ini hanya solusi Python-2. Seperti yang ditunjukkan oleh transkrip, itu jelas berjalan di bawah Python 3.5.2. Bahkan, saya baru memeriksanya lagi untuk konfirmasi. ... beberapa waktu berlalu sementara saya menyelidiki ... Sebenarnya, tidak apa-apa, tampaknya Anda berbicara tentang jawaban yang diterima saat ini daripada yang ini, jadi Anda mungkin harus berkomentar di sana daripada di sini. Tidak diragukan lagi kesalahan yang jujur. Bersulang.
paxdiablo

1
ya, saya tidak mengkritik Anda (terlepas dari listhal - hal :)). Di mana Anda pikir UV Anda baru saja berasal? :)
Jean-François Fabre

7

Untuk sampel ini pemahamannya paling cepat

$ python -m timeit -s 's = ["one", "two", "three"] * 1000' '[x.upper untuk x dalam s]'
1000 loop, terbaik 3: 809 usec per loop

$ python -m timeit -s 's = ["one", "two", "three"] * 1000' 'map (str.upper, s)'
1000 loop, terbaik 3: 1,12 msec per loop

$ python -m timeit -s = ["satu", "dua", "tiga"] * 1000 'peta (lambda x: x.upper (), s)'
1000 loop, terbaik 3: 1,77 msec per loop

5

seorang siswa bertanya, siswa lain dengan masalah yang sama menjawab :))

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

Larutan:

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

Solusi ini akan membuat daftar terpisah berisi item huruf kecil, terlepas dari kasus aslinya. Jika kasing asli adalah atas maka list sakan berisi huruf kecil dari masing-masing item dalam list p. Jika kasing asli item daftar sudah huruf kecil list pmaka list sakan menyimpan kasing item dan menyimpannya dalam huruf kecil. Sekarang Anda dapat menggunakan list sbukan list p.


1

Jika tujuan Anda adalah mencocokkan dengan string lain dengan mengonversi satu pass, Anda dapat menggunakannya str.casefold()juga.

Ini berguna ketika Anda memiliki karakter non-ascii dan mencocokkan dengan versi ascii (misalnya: maße vs masse). Meskipun str.loweratau str.uppergagal dalam kasus tersebut, str.casefold()akan berlalu. Ini tersedia dalam Python 3 dan idenya dibahas secara rinci dengan jawabannya 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

Versi paling atas dari jawaban teratas diberikan di sini oleh @Amorpheuses.

Dengan daftar nilai dalam val:

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

Ini bekerja dengan baik untuk saya dengan sumber teks f = open ().


1

Anda dapat mencoba menggunakan:

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)

Jika Anda membutuhkan string atau daftar sebagai output dan bukan iterator (ini untuk Python3), bandingkan ''.join(string).upper()opsi dengan ini:

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

Jika Anda mencoba mengonversi semua string menjadi huruf kecil dalam daftar, Anda dapat menggunakan panda:

import pandas as pd

data = ['Study', 'Insights']

pd_d = list(pd.Series(data).str.lower())

keluaran:

['study', 'insights']
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.