{"id":25122,"date":"2020-04-01T12:15:16","date_gmt":"2020-04-01T09:15:16","guid":{"rendered":"https:\/\/www.webcodegeeks.com\/?p=25122"},"modified":"2020-06-23T14:48:32","modified_gmt":"2020-06-23T11:48:32","slug":"how-to-convert-a-string-to-lowercase-in-python","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/python\/how-to-convert-a-string-to-lowercase-in-python\/","title":{"rendered":"How to Convert a String to Lowercase in Python"},"content":{"rendered":"\n<p>As this series grows, I\u2019ve started poking at seemingly simple problems to expose their complexity. This time, I thought it would be interesting to look at how to convert a string to lowercase.<\/p>\n\n\n\n<p>As it turns out, there\u2019s a really straightforward solution (<code>lower()<\/code>), but I think it\u2019s worth looking at a few homemade solutions first. For instance, we could try building up a string by looping over every character. If that sounds interesting, check out the rest of this article. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Problem Description<\/h2>\n\n\n\n<p>If you\u2019ve ever tried to write code which manipulates strings, you know how painful of a process it can be. For instance, try writing some code to reverse a string. <strong>Pro tip<\/strong>: it\u2019s not as easy as you think. I know this because I added string reversal as one of the challenges in our <a href=\"https:\/\/github.com\/TheRenegadeCoder\/sample-programs\">Sample Programs repository<\/a>.<\/p>\n\n\n\n<p>When I was building up that repo, I found out that you can\u2019t just start at the end of the string and print out the characters in reverse. That\u2019ll work for simple strings like most of the text in this article. However, it could fail for more complex characters like emojis.<\/p>\n\n\n\n<p>All that said, <strong>Python 3<\/strong> does a great job of abstracting characters, so you may not run into issues. For example, the following code seems to work fine:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_586910\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">&gt;&gt;&gt; hero = <\/code><code class=\"java string\">\"\ud83d\ude0a\"<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">&gt;&gt;&gt; hero[::-<\/code><code class=\"java value\">1<\/code><code class=\"java plain\">]<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java string\">'\ud83d\ude0a'<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Now, I bring this up because today we want to talk about converting a string to lowercase. If you\u2019ve been around Python awhile, you know there\u2019s a quick way to do this. However, if you haven\u2019t, there\u2019s a chance you might try to do it yourself (or you have to do it yourself for a course). As a result, I\u2019ll be setting a constraint for this entire article: <strong>assume ASCII<\/strong>.<\/p>\n\n\n\n<p>This constraint can save us a lot of pain and suffering. It basically restricts us to the first 128 characters (or 256 depending on who you ask). That way, we don\u2019t have to worry about dealing with characters from other languages or emojis.<\/p>\n\n\n\n<p>Assuming ASCII, we should be able to convert a string like \u201cAll Might\u201d to \u201call might\u201d fairly easily. In the sections below, we\u2019ll look at a few solutions that will be able to do just this.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Solutions<\/h2>\n\n\n\n<p>In this section, we\u2019ll take a look at each solution I could come up with. Since this problem has been trivially solved by the <code>lower()<\/code> method, most of these solutions are essentially brute force. In other words, each solution goes through a different strategy for converting a string to lowercase by hand. If that\u2019s not you\u2019re thing, feel free to jump to the last solution. For everyone else, let\u2019s take a look at our first brute force solution!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Convert a String to Lowercase by Brute Force<\/h3>\n\n\n\n<p>Since we\u2019re assuming ASCII, we can try to convert our string to lowercase by looking at the ordinal values of each character. In other words, each character is assigned to some number. If a character\u2019s ID falls within the range of capital letters, we should be able to find its corresponding lowercase ID and replace it. That\u2019s exactly what we do below:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_254194\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">hero = <\/code><code class=\"java string\">\"All Might\"<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">output = <\/code><code class=\"java string\">\"\"<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java keyword\">for<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in hero:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">if<\/code> <code class=\"java string\">\"A\"<\/code> <code class=\"java plain\">&lt;= <\/code><code class=\"java keyword\">char<\/code> <code class=\"java plain\">&lt;= <\/code><code class=\"java string\">\"Z\"<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">output += chr(ord(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">) - ord(<\/code><code class=\"java string\">'A'<\/code><code class=\"java plain\">) + ord(<\/code><code class=\"java string\">'a'<\/code><code class=\"java plain\">))<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">else<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">output += <\/code><code class=\"java keyword\">char<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Here, we create a string called <code>hero<\/code> which stores the name \u201cAll Might\u201d. Then, we create an empty output string. After that, we loop over every character in the string checking to see if the current character falls in the range of capital letters. If it does, we convert it to lowercase with this clever little expression:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_756172\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">chr(ord(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">) - ord(<\/code><code class=\"java string\">'A'<\/code><code class=\"java plain\">) + ord(<\/code><code class=\"java string\">'a'<\/code><code class=\"java plain\">))<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>By subtracting <code>ord('A')<\/code>, we get the index of the character in the alphabet. For example, if <code>char<\/code> was \u201cC\u201d, the expression <code>ord(char) - ord('A')<\/code> would be 2. Then, all we need to know is what the ordinal value of \u2018a\u2019 is to shift our index into the range of lowercase letters. In other words, this expression converts any uppercase letter to lowercase.<\/p>\n\n\n\n<p>One thing I don\u2019t love about this algorithm is the concatenation. In general, it\u2019s a bad idea to concatenate strings in a loop like this. As a result, we could use a list instead:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_335286\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">hero = <\/code><code class=\"java string\">\"All Might\"<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">output = []<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java keyword\">for<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in hero:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">if<\/code> <code class=\"java string\">\"A\"<\/code> <code class=\"java plain\">&lt;= <\/code><code class=\"java keyword\">char<\/code> <code class=\"java plain\">&lt;= <\/code><code class=\"java string\">\"Z\"<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">output.append(chr(ord(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">) - ord(<\/code><code class=\"java string\">'A'<\/code><code class=\"java plain\">) + ord(<\/code><code class=\"java string\">'a'<\/code><code class=\"java plain\">)))<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">else<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">output.append(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java plain\">output = <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(output)<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>In the performance section, we\u2019ll take a look to see if this matters at all. For now though, let\u2019s dig into some better options.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Convert a String to Lowercase Using ASCII Collections<\/h3>\n\n\n\n<p>In the previous solution, we computed lowercase values mathematically. However, what if we just happened to have the lowercase and uppercase letters available to us as a collection? As it turns out, the string library has us covered:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_407969\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">from string <\/code><code class=\"java keyword\">import<\/code> <code class=\"java plain\">ascii_lowercase, ascii_uppercase<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>If you\u2019re curious to know what these values look like, I checked for us:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_459629\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">&gt;&gt;&gt; ascii_lowercase<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java string\">'abcdefghijklmnopqrstuvwxyz'<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">&gt;&gt;&gt; ascii_uppercase<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java string\">'ABCDEFGHIJKLMNOPQRSTUVWXYZ'<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>As we can see, each value is a string containing the alphabet. Now, it\u2019s just a matter of mapping from one set to the other given an index:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_66309\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">hero = <\/code><code class=\"java string\">\"All Might\"<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">output = []<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java keyword\">for<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in hero:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">if<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in ascii_uppercase:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">output.append(ascii_lowercase[ascii_uppercase.index(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">)])<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">else<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">output.append(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java plain\">output = <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(output)<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Again, we loop over every character in our string. Of course, this time we check if that character is in the uppercase set. If it is, we look for the corresponding lowercase character and add it to our final string. Otherwise, we append the original character.<\/p>\n\n\n\n<p>Personally, I like this solution a little bit better because we\u2019re more explicitly dealing with certain sets of characters. That said, there is still a better solution ahead.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Convert a String to Lowercase Using a List Comprehension<\/h3>\n\n\n\n<p>Looking at the solutions above, I thought it might be fun to try to use a list comprehension. It\u2019s not pretty, but it gets the job done:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_526580\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">from string <\/code><code class=\"java keyword\">import<\/code> <code class=\"java plain\">ascii_uppercase, ascii_lowercase<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">hero = <\/code><code class=\"java string\">\"All Might\"<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">output = [ascii_lowercase[ascii_uppercase.index(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">)] <\/code><code class=\"java keyword\">if<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in ascii_uppercase <\/code><code class=\"java keyword\">else<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java keyword\">for<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in hero]<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">output = <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(output)<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>If you\u2019d prefer something a little more readable, here\u2019s the same list comprehension with the expression separate from the loop:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_948566\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">[<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">ascii_lowercase[ascii_uppercase.index(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">)] <\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">if<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in ascii_uppercase <\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">else<\/code> <code class=\"java keyword\">char<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">for<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in hero<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java plain\">]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Basically, we say that for each character in <code>hero<\/code>, assume we\u2019re going to convert uppercase to lowercase. Otherwise, leave the character unchanged.<\/p>\n\n\n\n<p>Honestly, this might be a bit cleaner if we pulled the expression out into a function:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_779262\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">def to_lowercase(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">: str):<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">if<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in ascii_uppercase:<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">ascii_lowercase[ascii_uppercase.index(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">)]<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">else<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java keyword\">char<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Then, we could call this function in place of that mess:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_306967\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">[to_lowercase(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">) <\/code><code class=\"java keyword\">for<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in hero]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Now, that\u2019s a lot cleaner! Of course, there is definitely a better solution to follow. That said, if you like list comprehensions, and you want to learn more about them, check out <a href=\"https:\/\/therenegadecoder.com\/code\/how-to-write-a-list-comprehension-in-python\/\">my article on how to write list comprehensions<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Convert a String to Lowercase Using the <code>lower()<\/code> Method<\/h3>\n\n\n\n<p>Up to this point, we tried rolling our own lowercase function. Due to the complexity of strings, it turned out to be a nontrivial matter. Luckily, the Python developers knew this would be a popular request, so they wrote a method for us:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_17559\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">hero = <\/code><code class=\"java string\">\"All Might\"<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">hero.lower()<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>And, that\u2019s it! In one line, we can convert a string to lowercase.<\/p>\n\n\n\n<p>Since we assumed ASCII up to this point, there\u2019s not much to say in terms of the benefits with this solution. Sure, <code>lower()<\/code> is likely more convenient and faster than our previous solutions, but our assumption has stopped us from talking about the real benefit: it works beyond ASCII.<\/p>\n\n\n\n<p>Unlike our previous solutions, this solution will work for basically any locale where the concepts of uppercase and lowercase make sense. In other words, <code>lower()<\/code> should work in contexts beyond ASCII. If you\u2019re interested in how it works under the hood, check out <a href=\"https:\/\/www.unicode.org\/versions\/Unicode9.0.0\/ch03.pdf\">section 3.13 of the Unicode standard<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Performance<\/h2>\n\n\n\n<p>At this point, let\u2019s take a look at how each solution compares in terms of performance. If you\u2019ve been around awhile, you know we start off testing by storing each solution in a string. If this is your first time seeing one of these tutorials, you can get up to speed on performance testing with <a href=\"https:\/\/therenegadecoder.com\/code\/how-to-performance-test-python-code\/\">this article<\/a>. Otherwise, here are the strings:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_807153\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<div class=\"line number23 index22 alt2\">23<\/div>\n<div class=\"line number24 index23 alt1\">24<\/div>\n<div class=\"line number25 index24 alt2\">25<\/div>\n<div class=\"line number26 index25 alt1\">26<\/div>\n<div class=\"line number27 index26 alt2\">27<\/div>\n<div class=\"line number28 index27 alt1\">28<\/div>\n<div class=\"line number29 index28 alt2\">29<\/div>\n<div class=\"line number30 index29 alt1\">30<\/div>\n<div class=\"line number31 index30 alt2\">31<\/div>\n<div class=\"line number32 index31 alt1\">32<\/div>\n<div class=\"line number33 index32 alt2\">33<\/div>\n<div class=\"line number34 index33 alt1\">34<\/div>\n<div class=\"line number35 index34 alt2\">35<\/div>\n<div class=\"line number36 index35 alt1\">36<\/div>\n<div class=\"line number37 index36 alt2\">37<\/div>\n<div class=\"line number38 index37 alt1\">38<\/div>\n<div class=\"line number39 index38 alt2\">39<\/div>\n<div class=\"line number40 index39 alt1\">40<\/div>\n<div class=\"line number41 index40 alt2\">41<\/div>\n<div class=\"line number42 index41 alt1\">42<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">setup = <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">hero = <\/code><code class=\"java string\">\"All Might\"<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">from string <\/code><code class=\"java keyword\">import<\/code> <code class=\"java plain\">ascii_lowercase, ascii_uppercase<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<div class=\"line number5 index4 alt2\">&nbsp;<\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java plain\">brute_force_concat = <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java plain\">output = <\/code><code class=\"java string\">\"\"<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java keyword\">for<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in hero:<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">if<\/code> <code class=\"java string\">\"A\"<\/code> <code class=\"java plain\">&lt;= <\/code><code class=\"java keyword\">char<\/code> <code class=\"java plain\">&lt;= <\/code><code class=\"java string\">\"Z\"<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">output += chr(ord(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">) - ord(<\/code><code class=\"java string\">'A'<\/code><code class=\"java plain\">) + ord(<\/code><code class=\"java string\">'a'<\/code><code class=\"java plain\">))<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">else<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">output += <\/code><code class=\"java keyword\">char<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<div class=\"line number14 index13 alt1\">&nbsp;<\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java plain\">brute_force_list = <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java plain\">output = []<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java keyword\">for<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in hero:<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">if<\/code> <code class=\"java string\">\"A\"<\/code> <code class=\"java plain\">&lt;= <\/code><code class=\"java keyword\">char<\/code> <code class=\"java plain\">&lt;= <\/code><code class=\"java string\">\"Z\"<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">output.append(chr(ord(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">) - ord(<\/code><code class=\"java string\">'A'<\/code><code class=\"java plain\">) + ord(<\/code><code class=\"java string\">'a'<\/code><code class=\"java plain\">)))<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">else<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">output.append(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"java plain\">output = <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(output)<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<div class=\"line number24 index23 alt1\">&nbsp;<\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"java plain\">ascii_collection = <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"java plain\">output = []<\/code><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"java keyword\">for<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in hero:<\/code><\/div>\n<div class=\"line number28 index27 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">if<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in ascii_uppercase:<\/code><\/div>\n<div class=\"line number29 index28 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">output.append(ascii_lowercase[ascii_uppercase.index(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">)])<\/code><\/div>\n<div class=\"line number30 index29 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">else<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number31 index30 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">output.append(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number32 index31 alt1\"><code class=\"java plain\">output = <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(output)<\/code><\/div>\n<div class=\"line number33 index32 alt2\"><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<div class=\"line number34 index33 alt1\">&nbsp;<\/div>\n<div class=\"line number35 index34 alt2\"><code class=\"java plain\">list_comp = <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<div class=\"line number36 index35 alt1\"><code class=\"java plain\">output = [ascii_lowercase[ascii_uppercase.index(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">)] <\/code><code class=\"java keyword\">if<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in ascii_uppercase <\/code><code class=\"java keyword\">else<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java keyword\">for<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in hero]<\/code><\/div>\n<div class=\"line number37 index36 alt2\"><code class=\"java plain\">output = <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(output)<\/code><\/div>\n<div class=\"line number38 index37 alt1\"><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<div class=\"line number39 index38 alt2\">&nbsp;<\/div>\n<div class=\"line number40 index39 alt1\"><code class=\"java plain\">lower_method = <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<div class=\"line number41 index40 alt2\"><code class=\"java plain\">output = hero.lower()<\/code><\/div>\n<div class=\"line number42 index41 alt1\"><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Then, if we want to performance test these solutions, we can import the <code>timeit<\/code> library and run the <code>repeat()<\/code> method:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_70513\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">&gt;&gt;&gt; <\/code><code class=\"java keyword\">import<\/code> <code class=\"java plain\">timeit<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=brute_force_concat))<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java value\">1.702892600000041<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=brute_force_list))<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java value\">1.9661427000000913<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=ascii_collection))<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java value\">1.5348989000001438<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=list_comp))<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java value\">1.4514239000000089<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=lower_method))<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java value\">0.07294070000011743<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Unsurprisingly, the <code>lower()<\/code> method is incredibly fast. We\u2019re talking a 100 times faster than our brute force solutions. That said, I was actually surprised by the minor improvement in speed that concatenation has over using a list in our example. As a result, I decided to use a larger string for testing:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_616314\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">&gt;&gt;&gt; setup = <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">hero = <\/code><code class=\"java string\">\"If you feel yourself hitting up against your limit remember for what cause you clench your fists... remember why you started down this path, and let that memory carry you beyond your limit.\"<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">from string <\/code><code class=\"java keyword\">import<\/code> <code class=\"java plain\">ascii_lowercase, ascii_uppercase<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=brute_force_concat))<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java value\">22.304970499999996<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=brute_force_list))<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java value\">24.565209700000025<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=ascii_collection))<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java value\">19.60345490000003<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=list_comp))<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java value\">13.309821600000078<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=lower_method))<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java value\">0.16421549999995477<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Somehow, concatenation is still a little bit faster than using a list. This surprised me a lot. After all, <a href=\"https:\/\/blog.mclemon.io\/python-efficient-string-concatenation-in-python-2016-edition\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\">pretty much all literature points to concatenation being a bad idea<\/a>, so I was a bit stumped. As a result, I actually went as far as to duplicate the test code from that article above to see if I was doing something wrong in my testing:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_675891\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">&gt;&gt;&gt; setup = <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">hero = <\/code><code class=\"java string\">\"All Might\"<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">loop_count = <\/code><code class=\"java value\">500<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">from string <\/code><code class=\"java keyword\">import<\/code> <code class=\"java plain\">ascii_lowercase, ascii_uppercase<\/code><\/div>\n<div class=\"line number5 index4 alt2\">&nbsp;<\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java plain\">def method1():<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">out_str = <\/code><code class=\"java string\">''<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">for<\/code> <code class=\"java plain\">num in range(loop_count):<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">out_str += str(num)<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java plain\">out_str<\/code><\/div>\n<div class=\"line number11 index10 alt2\">&nbsp;<\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java plain\">def method4():<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java plain\">str_list = []<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">for<\/code> <code class=\"java plain\">num in range(loop_count):<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">str_list.append(str(num))<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">return<\/code> <code class=\"java string\">''<\/code><code class=\"java plain\">.join(str_list)<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java string\">\"\"<\/code><code class=\"java plain\">\"<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=<\/code><code class=\"java string\">\"method1()\"<\/code><code class=\"java plain\">))<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"java value\">156.1076584<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=<\/code><code class=\"java string\">\"method4()\"<\/code><code class=\"java plain\">))<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"java value\">124.92521890000012<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>To me, there\u2019s one of two things going on:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Either my test is bad<\/li><li>Or, there is some crossover point where the <code>join()<\/code> method is better<\/li><\/ul>\n\n\n\n<p>As a result, I decided to test the same code for various amounts of <code>loop_count<\/code>:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_887064\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<div class=\"line number23 index22 alt2\">23<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\"># Loop count = <\/code><code class=\"java value\">10<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=<\/code><code class=\"java string\">\"method1()\"<\/code><code class=\"java plain\">))<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java value\">2.665588600000774<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=<\/code><code class=\"java string\">\"method4()\"<\/code><code class=\"java plain\">))<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java value\">3.069867900000645<\/code><\/div>\n<div class=\"line number6 index5 alt1\">&nbsp;<\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java plain\"># Loop count = <\/code><code class=\"java value\">25<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=<\/code><code class=\"java string\">\"method1()\"<\/code><code class=\"java plain\">))<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java value\">6.647211299999981<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=<\/code><code class=\"java string\">\"method4()\"<\/code><code class=\"java plain\">))<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java value\">6.649540800000068<\/code><\/div>\n<div class=\"line number12 index11 alt1\">&nbsp;<\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java plain\"># Loop count = <\/code><code class=\"java value\">50<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=<\/code><code class=\"java string\">\"method1()\"<\/code><code class=\"java plain\">))<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java value\">12.666602099999182<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=<\/code><code class=\"java string\">\"method4()\"<\/code><code class=\"java plain\">))<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java value\">12.962779500000579<\/code><\/div>\n<div class=\"line number18 index17 alt1\">&nbsp;<\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"java plain\"># Loop count = <\/code><code class=\"java value\">100<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=<\/code><code class=\"java string\">\"method1()\"<\/code><code class=\"java plain\">))<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"java value\">25.012076299999535<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"java plain\">&gt;&gt;&gt; min(timeit.repeat(setup=setup, stmt=<\/code><code class=\"java string\">\"method4()\"<\/code><code class=\"java plain\">))<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"java value\">29.01509150000038<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>As I was running these tests, I had a sudden epiphany: you can\u2019t run other programs while testing code. In this case, tests were taking so long that I decided to play Overwatch while waiting. <strong>Bad idea!<\/strong> It skewed all my tests. As a result, I decided to retest all of our solutions under the same exact conditions. Here are the results where the parentheses indicate the length of the string under test:<\/p>\n\n\n\n<figure>\n<table border=\"1\">\n<thead>\n<tr>\n<th>Solution<\/th>\n<th>Time (10)<\/th>\n<th>Time (25)<\/th>\n<th>Time (50)<\/th>\n<th>Time (100)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Brute Force Concatenation<\/td>\n<td>0.94944<\/td>\n<td>3.72814<\/td>\n<td>8.33579<\/td>\n<td>17.56751<\/td>\n<\/tr>\n<tr>\n<td>Brute Force List<\/td>\n<td>1.27567<\/td>\n<td>4.45463<\/td>\n<td>9.33258<\/td>\n<td>20.43046<\/td>\n<\/tr>\n<tr>\n<td>ASCII Collection<\/td>\n<td>1.23441<\/td>\n<td>4.26218<\/td>\n<td>9.26588<\/td>\n<td>19.34155<\/td>\n<\/tr>\n<tr>\n<td>List Comprehension<\/td>\n<td>1.03274<\/td>\n<td>2.99414<\/td>\n<td>6.13634<\/td>\n<td>12.71114<\/td>\n<\/tr>\n<tr>\n<td>Lower Method<\/td>\n<td>0.07121<\/td>\n<td>0.08575<\/td>\n<td>0.11029<\/td>\n<td>0.163998<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n\n\n<p>To be honest, I wasn\u2019t able to isolate the discrepancy. My guess is that at some point concatenation gets bad; I just haven\u2019t been able to prove it. That said, I haven\u2019t found myself building up massive strings, so I don\u2019t imagine it actually matters. Of course, there\u2019s probably some application where it does.<\/p>\n\n\n\n<p>At any rate, <strong>it\u2019s clear that the <code>lower()<\/code> method is almost certainly the way to go<\/strong> (unless you have some sort of class assignment that says otherwise). Of course, take these measures with a grain of salt. For context, I\u2019m on a Windows 10 system running Python 3.8.2.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Challenge<\/h2>\n\n\n\n<p>Since we spent the whole article talking about converting strings to lowercase, I figured for the challenge we can try something a little different. To make things more interesting, I thought it might even be fun to specify a couple challenges:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Convert a string to uppercase (e.g. \u201call might\u201d -&gt; \u201cALL MIGHT\u201d)<\/li><li>Convert a string to sarcasm case (e.g. \u201cAll Might\u201d -&gt; \u201cAlL miGhT\u201d)\n<ul>\n<li>For this one, I wasn\u2019t sure if it made more sense to alternate or just randomly case each letter. You can decide!<\/li>\n<\/ul>\n<\/li><li>Convert a string to title case (e.g. \u201call might\u201d -&gt; \u201cAll Might\u201d)<\/li><\/ol>\n\n\n\n<p>Each one of these challenges comes with a unique set of problems. Feel free to share a solution to any of them down below in the comments. As always, I\u2019ll drop one down there as well to get y\u2019all started.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A Little Recap<\/h2>\n\n\n\n<p>With all that said, I think we\u2019re done for the day. Here are all the solutions from this article in one convenient place:<\/p>\n\n\n\n<div>\n<div id=\"highlighter_717757\" class=\"syntaxhighlighter  java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<div class=\"line number23 index22 alt2\">23<\/div>\n<div class=\"line number24 index23 alt1\">24<\/div>\n<div class=\"line number25 index24 alt2\">25<\/div>\n<div class=\"line number26 index25 alt1\">26<\/div>\n<div class=\"line number27 index26 alt2\">27<\/div>\n<div class=\"line number28 index27 alt1\">28<\/div>\n<div class=\"line number29 index28 alt2\">29<\/div>\n<div class=\"line number30 index29 alt1\">30<\/div>\n<div class=\"line number31 index30 alt2\">31<\/div>\n<div class=\"line number32 index31 alt1\">32<\/div>\n<div class=\"line number33 index32 alt2\">33<\/div>\n<div class=\"line number34 index33 alt1\">34<\/div>\n<div class=\"line number35 index34 alt2\">35<\/div>\n<div class=\"line number36 index35 alt1\">36<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">from string <\/code><code class=\"java keyword\">import<\/code> <code class=\"java plain\">ascii_lowercase, ascii_uppercase<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">hero = <\/code><code class=\"java string\">\"All Might\"<\/code><\/div>\n<div class=\"line number4 index3 alt1\">&nbsp;<\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\"># Brute force using concatenation<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java plain\">output = <\/code><code class=\"java string\">\"\"<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java keyword\">for<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in hero:<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">if<\/code> <code class=\"java string\">\"A\"<\/code> <code class=\"java plain\">&lt;= <\/code><code class=\"java keyword\">char<\/code> <code class=\"java plain\">&lt;= <\/code><code class=\"java string\">\"Z\"<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">output += chr(ord(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">) - ord(<\/code><code class=\"java string\">'A'<\/code><code class=\"java plain\">) + ord(<\/code><code class=\"java string\">'a'<\/code><code class=\"java plain\">))<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">else<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">output += <\/code><code class=\"java keyword\">char<\/code><\/div>\n<div class=\"line number12 index11 alt1\">&nbsp;<\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java plain\"># Brute force using join<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java plain\">output = []<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java keyword\">for<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in hero:<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">if<\/code> <code class=\"java string\">\"A\"<\/code> <code class=\"java plain\">&lt;= <\/code><code class=\"java keyword\">char<\/code> <code class=\"java plain\">&lt;= <\/code><code class=\"java string\">\"Z\"<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">output.append(chr(ord(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">) - ord(<\/code><code class=\"java string\">'A'<\/code><code class=\"java plain\">) + ord(<\/code><code class=\"java string\">'a'<\/code><code class=\"java plain\">)))<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">else<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">output.append(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"java plain\">output = <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(output)<\/code><\/div>\n<div class=\"line number21 index20 alt2\">&nbsp;<\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"java plain\"># Brute force using ASCII collections<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"java plain\">output = []<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"java keyword\">for<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in hero:<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">if<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in ascii_uppercase:<\/code><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">output.append(ascii_lowercase[ascii_uppercase.index(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">)])<\/code><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"java spaces\">&nbsp;&nbsp;<\/code><code class=\"java keyword\">else<\/code><code class=\"java plain\">:<\/code><\/div>\n<div class=\"line number28 index27 alt1\"><code class=\"java spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"java plain\">output.append(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">)<\/code><\/div>\n<div class=\"line number29 index28 alt2\"><code class=\"java plain\">output = <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(output)<\/code><\/div>\n<div class=\"line number30 index29 alt1\">&nbsp;<\/div>\n<div class=\"line number31 index30 alt2\"><code class=\"java plain\"># Brute force using a list comprehension<\/code><\/div>\n<div class=\"line number32 index31 alt1\"><code class=\"java plain\">output = [ascii_lowercase[ascii_uppercase.index(<\/code><code class=\"java keyword\">char<\/code><code class=\"java plain\">)] <\/code><code class=\"java keyword\">if<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in ascii_uppercase <\/code><code class=\"java keyword\">else<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java keyword\">for<\/code> <code class=\"java keyword\">char<\/code> <code class=\"java plain\">in hero]<\/code><\/div>\n<div class=\"line number33 index32 alt2\"><code class=\"java plain\">output = <\/code><code class=\"java string\">\"\"<\/code><code class=\"java plain\">.join(output)<\/code><\/div>\n<div class=\"line number34 index33 alt1\">&nbsp;<\/div>\n<div class=\"line number35 index34 alt2\"><code class=\"java plain\"># Built-in Python solution<\/code><\/div>\n<div class=\"line number36 index35 alt1\"><code class=\"java plain\">output = hero.lower()<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>In addition, you\u2019re welcome to keep browsing. Here are some related articles:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/www.webcodegeeks.com\/python\/how-to-compare-strings-in-python-equality-and-identity\/\">How to Compare Strings in Python: Equality and Identity<\/a><\/li><li><a href=\"https:\/\/www.webcodegeeks.com\/python\/how-to-check-if-a-string-contains-a-substring-in-python-in-index-and-more\/\">How to Check if a String Contains a Substring in Python: In, Index, and More<\/a><\/li><\/ul>\n\n\n\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td>\n<p>Published on Web Code Geeks with permission by Jeremy Grifski, partner at our <a href=\"\/\/www.webcodegeeks.com\/join-us\/wcg\/\" target=\"_blank\" rel=\"noopener noreferrer\">WCG program<\/a>. See the original article here: <a href=\"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/\" target=\"_blank\" rel=\"noopener noreferrer\">How to Convert a String to Lowercase in Python<\/a><\/p>\n<p>Opinions expressed by Web Code Geeks contributors are their own.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>As this series grows, I\u2019ve started poking at seemingly simple problems to expose their complexity. This time, I thought it would be interesting to look at how to convert a string to lowercase. As it turns out, there\u2019s a really straightforward solution (lower()), but I think it\u2019s worth looking at a few homemade solutions first. &hellip;<\/p>\n","protected":false},"author":14722,"featured_media":1651,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[53],"tags":[],"class_list":["post-25122","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to Convert a String to Lowercase in Python - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"Interested to learn about Convert a String? Check our article explaining how to convert a string to lowercase in python with examples.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Convert a String to Lowercase in Python - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"Interested to learn about Convert a String? Check our article explaining how to convert a string to lowercase in python with examples.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2020-04-01T09:15:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-06-23T11:48:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Jeremy Grifski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@RenegadeCoder94\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeremy Grifski\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/how-to-convert-a-string-to-lowercase-in-python\/\"},\"author\":{\"name\":\"Jeremy Grifski\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/7eaa8e89cf23a5de82a048beb4c59aa1\"},\"headline\":\"How to Convert a String to Lowercase in Python\",\"datePublished\":\"2020-04-01T09:15:16+00:00\",\"dateModified\":\"2020-06-23T11:48:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/how-to-convert-a-string-to-lowercase-in-python\/\"},\"wordCount\":1895,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"articleSection\":[\"Python\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/how-to-convert-a-string-to-lowercase-in-python\/\",\"url\":\"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/\",\"name\":\"How to Convert a String to Lowercase in Python - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"datePublished\":\"2020-04-01T09:15:16+00:00\",\"dateModified\":\"2020-06-23T11:48:32+00:00\",\"description\":\"Interested to learn about Convert a String? Check our article explaining how to convert a string to lowercase in python with examples.\",\"breadcrumb\":{\"@id\":\"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/python\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"How to Convert a String to Lowercase in Python\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/7eaa8e89cf23a5de82a048beb4c59aa1\",\"name\":\"Jeremy Grifski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/9d50311a27dff0a54d775b6106b8f804d5d11d0b5182ed537f325046a020c6f5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/9d50311a27dff0a54d775b6106b8f804d5d11d0b5182ed537f325046a020c6f5?s=96&d=mm&r=g\",\"caption\":\"Jeremy Grifski\"},\"description\":\"Jeremy is the founder of The Renegade Coder, a software curriculum website launched in 2017. In addition, he is a PhD student with an interest in education and data visualization.\",\"sameAs\":[\"https:\/\/therenegadecoder.com\/\",\"https:\/\/www.linkedin.com\/in\/jeremy-grifski-22240552\/\",\"https:\/\/x.com\/RenegadeCoder94\"],\"url\":\"https:\/\/www.webcodegeeks.com\/author\/jeremy-grifski\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Convert a String to Lowercase in Python - Web Code Geeks - 2026","description":"Interested to learn about Convert a String? Check our article explaining how to convert a string to lowercase in python with examples.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/","og_locale":"en_US","og_type":"article","og_title":"How to Convert a String to Lowercase in Python - Web Code Geeks - 2026","og_description":"Interested to learn about Convert a String? Check our article explaining how to convert a string to lowercase in python with examples.","og_url":"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_published_time":"2020-04-01T09:15:16+00:00","article_modified_time":"2020-06-23T11:48:32+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","type":"image\/jpeg"}],"author":"Jeremy Grifski","twitter_card":"summary_large_image","twitter_creator":"@RenegadeCoder94","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Jeremy Grifski","Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/python\/how-to-convert-a-string-to-lowercase-in-python\/"},"author":{"name":"Jeremy Grifski","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/7eaa8e89cf23a5de82a048beb4c59aa1"},"headline":"How to Convert a String to Lowercase in Python","datePublished":"2020-04-01T09:15:16+00:00","dateModified":"2020-06-23T11:48:32+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/python\/how-to-convert-a-string-to-lowercase-in-python\/"},"wordCount":1895,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","articleSection":["Python"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/python\/how-to-convert-a-string-to-lowercase-in-python\/","url":"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/","name":"How to Convert a String to Lowercase in Python - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/#primaryimage"},"image":{"@id":"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","datePublished":"2020-04-01T09:15:16+00:00","dateModified":"2020-06-23T11:48:32+00:00","description":"Interested to learn about Convert a String? Check our article explaining how to convert a string to lowercase in python with examples.","breadcrumb":{"@id":"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/therenegadecoder.com\/code\/how-to-convert-a-string-to-lowercase-in-python\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Python","item":"https:\/\/www.webcodegeeks.com\/category\/python\/"},{"@type":"ListItem","position":3,"name":"How to Convert a String to Lowercase in Python"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/7eaa8e89cf23a5de82a048beb4c59aa1","name":"Jeremy Grifski","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/9d50311a27dff0a54d775b6106b8f804d5d11d0b5182ed537f325046a020c6f5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9d50311a27dff0a54d775b6106b8f804d5d11d0b5182ed537f325046a020c6f5?s=96&d=mm&r=g","caption":"Jeremy Grifski"},"description":"Jeremy is the founder of The Renegade Coder, a software curriculum website launched in 2017. In addition, he is a PhD student with an interest in education and data visualization.","sameAs":["https:\/\/therenegadecoder.com\/","https:\/\/www.linkedin.com\/in\/jeremy-grifski-22240552\/","https:\/\/x.com\/RenegadeCoder94"],"url":"https:\/\/www.webcodegeeks.com\/author\/jeremy-grifski\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/25122","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/14722"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=25122"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/25122\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/1651"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=25122"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=25122"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=25122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}