I have a Python list variable that contains strings. Is there a function that can convert all the strings in one pass to lowercase and vice versa, uppercase?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
It can be done with list comprehensions
>>> [x.lower() for x in ["A", "B", "C"]] ['a', 'b', 'c'] >>> [x.upper() for x in ["a", "b", "c"]] ['A', 'B', 'C']
or with the map function
>>> list(map(lambda x: x.lower(), ["A", "B", "C"])) ['a', 'b', 'c'] >>> list(map(lambda x: x.upper(), ["a", "b", "c"])) ['A', 'B', 'C']
Method 2
Besides being easier to read (for many people), list comprehensions win the speed race, too:
$ 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
Method 3
>>> list(map(str.lower,["A","B","C"])) ['a', 'b', 'c']
Method 4
List comprehension is how I’d do it, it’s the “Pythonic” way. The following transcript shows how to convert a list to all upper case then back to lower:
<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="bcccddc4fcccddc4ded3c48b">[email protected]</a>:~$ 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']
Method 5
For this sample the comprehension is fastest
$ python -m timeit -s 's=["one","two","three"]*1000' '[x.upper for x in s]' 1000 loops, best of 3: 809 usec per loop $ python -m timeit -s 's=["one","two","three"]*1000' 'map(str.upper,s)' 1000 loops, best of 3: 1.12 msec per loop $ python -m timeit -s 's=["one","two","three"]*1000' 'map(lambda x:x.upper(),s)' 1000 loops, best of 3: 1.77 msec per loop
Method 6
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)))
Method 7
a student asking, another student with the same problem answering :))
fruits=['orange', 'grape', 'kiwi', 'apple', 'mango', 'fig', 'lemon']
newList = []
for fruit in fruits:
newList.append(fruit.upper())
print(newList)
Method 8
A much simpler version of the top answer is given here by @Amorpheuses.
With a list of values in val:
valsLower = [item.lower() for item in vals]
This worked well for me with an f = open() text source.
Method 9
Solution:
>>> 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']
This solution will create a separate list containing the lowercase items, regardless of their original case. If the original case is upper then the list s will contain lowercase of the respective item in list p. If the original case of the list item is already lowercase in list p then the list s will retain the item’s case and keep it in lowercase. Now you can use list s instead of list p.
Method 10
If your purpose is to matching with another string by converting in one pass, you can use str.casefold() as well.
This is useful when you have non-ascii characters and matching with ascii versions(eg: maße vs masse).Though str.lower or str.upper fails in such cases, str.casefold() will pass.
This is available in Python 3 and the idea is discussed in detail with the answer https://stackoverflow.com/a/31599276/4848659.
>>>str="Hello World"; >>>print(str.lower()); hello world >>>print(str.upper()); HELLO WOLRD >>>print(str.casefold()); hello world
Method 11
If you are trying to convert all string to lowercase in the list, You can use pandas :
import pandas as pd data = ['Study', 'Insights'] pd_d = list(pd.Series(data).str.lower())
output:
['study', 'insights']
Method 12
You could try using:
my_list = ['india', 'america', 'china', 'korea']
def capitalize_list(item):
return item.upper()
print(list(map(capitalize_list, my_list)))
Method 13
Here’s another solution to the problem, but I don’t recommend using it. Just putting it here for completion of this topic since this solution wasn’t added before.
import timeit
def foo1():
L = ["A", "B", "C", "&"]
return [x.lower() for x in L]
def foo2():
L = ["A", "B", "C", "&"]
return "%".join(L).lower().split("%")
for i in range(10):
print("foo1", timeit.timeit(foo1, number=100000))
print("foo2", timeit.timeit(foo2, number=100000), end="nn")
foo1 0.0814619 foo2 0.058695300000000006 foo1 0.08401910000000004 foo2 0.06001100000000004 foo1 0.08252670000000001 foo2 0.0601641 foo1 0.08721100000000004 foo2 0.06254229999999994 foo1 0.08776279999999992 foo2 0.05946070000000003 foo1 0.08383590000000007 foo2 0.05982449999999995 foo1 0.08354679999999992 foo2 0.05930219999999997 foo1 0.08526650000000013 foo2 0.060690699999999875 foo1 0.09940110000000013 foo2 0.08484609999999981 foo1 0.09921800000000003 foo2 0.06182889999999985
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0