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']
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
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
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
Python3.5.2(default,Nov172016,17:05:23)[GCC 5.4.020160609] 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']
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
>>> s =[]>>> p =['This','That','There','is','apple']>>>[s.append(i.lower())ifnot 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.
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
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)
Jawaban:
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:Anda juga dapat menggunakan
map
fungsi ini:sumber
list(map(lambda x:x.upper(),["a","b","c"]))
map(str.lower, ["A","B","C"])
Selain lebih mudah dibaca (bagi banyak orang), pemahaman daftar juga memenangkan perlombaan cepat:
sumber
map
memenangkan perlombaan, tetapi tidak melakukan apa-apa :)map(str.lower,["A","B","C"])
tercepat adalah python3.7.5sumber
str.upper
untuk mengkonversi ke huruf besarPemahaman daftar adalah bagaimana saya melakukannya, itu adalah cara "Pythonic". Transkrip berikut menunjukkan cara mengonversi daftar ke semua huruf besar kemudian kembali ke bawah:
sumber
list
sebagai nama variabel bukan pilihan terbaik :)list
hal - hal :)). Di mana Anda pikir UV Anda baru saja berasal? :)Untuk sampel ini pemahamannya paling cepat
sumber
seorang siswa bertanya, siswa lain dengan masalah yang sama menjawab :))
sumber
sumber
Larutan:
Solusi ini akan membuat daftar terpisah berisi item huruf kecil, terlepas dari kasus aslinya. Jika kasing asli adalah atas maka
list s
akan berisi huruf kecil dari masing-masing item dalamlist p
. Jika kasing asli item daftar sudah huruf kecillist p
makalist s
akan menyimpan kasing item dan menyimpannya dalam huruf kecil. Sekarang Anda dapat menggunakanlist s
bukanlist p
.sumber
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.lower
ataustr.upper
gagal 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 .sumber
Versi paling atas dari jawaban teratas diberikan di sini oleh @Amorpheuses.
Dengan daftar nilai dalam val:
Ini bekerja dengan baik untuk saya dengan sumber teks f = open ().
sumber
Anda dapat mencoba menggunakan:
sumber
Python3.6.8
Jika Anda membutuhkan string atau daftar sebagai output dan bukan iterator (ini untuk Python3), bandingkan
''.join(string).upper()
opsi dengan ini:sumber
Jika Anda mencoba mengonversi semua string menjadi huruf kecil dalam daftar, Anda dapat menggunakan panda:
keluaran:
sumber