[Tutor] Sorting a list in ascending order [RESOLVED]
Ken G.
beachkidken at gmail.com
Fri Apr 29 19:05:27 EDT 2016
On 04/29/2016 05:10 PM, Martin A. Brown wrote:
> Greetings Ken and welcome to Python,
>
>> Using Linux 2.7.6 in Ubuntu 14.04.4. Thanks.
> Thank you for this information. I have one tip for you: While
> Python 2.x will still be around for a while, if you are learning
> Python today, I'd suggest Python 3.x. You can read more about the
> differences online (or ask here), if you care. The only syntax
> difference that usually trips up beginners is the following:
>
> print line # Python 2.x
> print(line) # Python 3.x
>
> Though there are other differences, this is one of the most obvious
> to all Python programmers. With that said, I'll just answer your
> question using Python 2.x, since everything else in your example
> will work perfectly the same in either version.
>
> I intend to suggest what you should read, and then what you should
> try to run in order to address your question(s).
>
> I will paste my entire interactive Python sessions below. Did you
> know that you can use the Python interpreter as a shell to test out
> how things behave? Very handy. Try typing 'python' at the CLI and
> you should see this:
>
> $ python
> Python 2.7.8 (default, Sep 30 2014, 15:34:38) [GCC] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
> >>>
>
> So, when you see ">>>" below, that's in the Python shell (2.7.8 in
> my case, 2.7.6 in yours).
>
>> In entering five random number, how can I best sort it into
>> ascending order, such as 0511414453?
> OK, so you have five random numbers, but you seem to want to print
> them without any visual space between them. A bit strange, but OK!
>
> Fragment #1:
>
>> number01 = "41"
>> number02 = "11"
>> number03 = "05"
>> number04 = "53"
>> number05 = "44"
> Observation: You define a variable called 'number01', which
> actually contains a string value. You can call the variable
> anything you want, but that will not change the type of the object
> to which your variable name is bound. For example:
>
> >>> number01 = "41"
> >>> type(number01)
> <type 'str'>
>
> Suggestion #1, try this instead:
>
> >>> number01 = 41
> >>> type(number01)
> <type 'int'>
>
> Ah-ha! Now, we are dealing with integers (numbers).
>
> Fragment #2:
>
>> line = number01 + number02 + number03 + number04 + number05
> Observation: Since all of the variables (named number01, number02,
> number03, etc....) contain strings, you are using string
> concatenation to create a new string. After the above command
> executes, you have this:
>
> >>> line
> '4111055344'
> >>> type(line)
> <type 'str'>
>
> Comment: You don't really want a string, do you? Keep reading for
> a moment, and I'll come back to this.
>
> Also, I don't think you really want to add the integers. That would
> be 41 + 11 + 05 + 53 + 44 = 154. But, you want to keep the numbers
> and sort them. We will need to keep them in a list. And, Python
> has a data structure for you...called, obviously enough list().
>
> Fragment #3:
>
>> print
>> print line
>> line.sort()
>>
>> Traceback (most recent call last):
>> File "Mega_Millions_01_Tickets_Entry_TEST_TEST.py", line 11, in <module>
>> print line.sort()
>>
>> AttributeError: 'str' object has no attribute 'sort'
> Observation: This message is called an Exception, in Python.
> There are many different kinds of exceptions--this one is called
> AttributeError, but the message of the exception is the important
> part for us here. It doesn't make sense to sort a string. You can
> sort two strings, of course. But not a single string.
>
> Anyway, the important thing about the Exception is it tries to give
> you a good deal of information about which line of code did
> something that was problematic, and what code called that code (this
> is why it's called a "Traceback").
>
> Now, I'll rewind to the beginning and try to go through the problem
> again, changing a few pieces of your program to get you closer to
> your solution.
>
> First, let's use the right datatype, an int, for each number.
> Second, let's use a list() to store the numbers (instead of five
> separate named variables; easy to mistype names).
> Third, let's sort it.
> Then, let's print it.
>
> >>> nums = [41, 11, 5, 53, 44] # -- create/populate a list
> >>> nums
> [41, 11, 5, 53, 44] # -- still looks good
> >>> nums.sort() # -- sort, in place!
> >>> nums
> [5, 11, 41, 44, 53] # -- Ta-da!
>
> I'm going to do the same thing a slightly different way, now, so you
> can see how to add stuff to a list:
>
> >>> nums = list()
> >>> nums.append(41)
> >>> nums.append(11)
> >>> nums.append(5)
> >>> nums.append(53)
> >>> nums.append(44)
> >>> nums
> [41, 11, 5, 53, 44]
>
> In each case the variable 'nums' still contains the same data. We
> just got there in a different series of steps. You may decide which
> makes more sense to you in any given situation.
>
> So, suggestion, play with lists, and see how they work.
>
> Now, we have to figure out how to print the contents of the list.
> Here's one way, but it is not the output you appear to want.
>
> >>> print nums
> [5, 11, 41, 44, 53]
>
> I'm guessing you want '05 11 41 44 53'.
>
> There are many ways to convert from one data type to another or to
> format the output of something when you want to print it. So, I
> will show you one or two ways, but there are many ways you could do
> this. It's good to learn to read them all, but you can always pick
> the one that works best for your situation.
>
> Conversion is one way The 'str' function converts the int (17) into
> a string. I store that in a variable called string_num. The 'type'
> function tells us that the contents of the variable string_num are
> of type 'str':
>
> >>> num = 17
> >>> string_num = str(num)
> >>> string_num
> '17'
> >>> type(string_num)
> <type 'str'>
>
> This is useful, but, we are not going to do that here.
>
> Detour to format strings! What I'm about to show is how you can
> format a value (usually in preparation for output/printing).
>
> There are many different ways to print numbers, as you may know from
> prior mathematics classes. (Ignoring some possibly important
> subtleties for a moment,) 1, 1.0, 1e0 are different ways of printing
> the value of 1.
>
> >>> num = 7
> >>> '%d' % (num,)
> '7'
>
> Let's add a leading zero:
>
> >>> '%02d' % (num,)
> '07'
>
> I think that's what you want.
>
> Returning to your data, you might be worried about that 5, which was
> missing its leading zero. Well, as you can see the number is never
> stored with that leading zero. A number is a number. However, we
> can produce the leading zero when we print.
>
> >>> stringified_nums = list()
> >>> for x in nums:
> ... stringified_nums.append('%02d' % (x,))
> >>> stringified_nums
> ['05', '11', '41', '44', '53']
>
> Lastly, let's print the stringified_nums; do you want to print them
> with colons separating the numbers, semicolons, commas, a hyphen?
>
> >>> ':'.join(stringified_nums)
> '05:11:41:44:53'
> >>> ','.join(stringified_nums)
> '05,11,41,44,53'
>
> Now, I'm going to put it all together.....
>
> nums = [41, 11, 5, 53, 44]
> nums.sort()
> outstr = list()
> for x in nums:
> outstr.append('%02d' % (x,))
> print ' '.join(outstr)
>
> Hopefully that made sense to you. I include a few links to various
> places in the Python project documentation that may help you. In
> particular, I'd recommend that you read through the Python tutorial
> and keep a Python interactive interpreter open while you do that, so
> you can play with the different datatypes and functions.
>
> If you have more questions, please ask here, there are quite a few
> others who are happy to help.
>
> Best of luck,
>
> -Martin
>
> Tutorial: https://docs.python.org/2/tutorial/introduction.html
> on numbers: https://docs.python.org/2/tutorial/introduction.html#numbers
> on strings: https://docs.python.org/2/tutorial/introduction.html#strings
> on lists: https://docs.python.org/2/tutorial/introduction.html#lists
>
> Reference: https://docs.python.org/2/library/index.html
> on datatypes: https://docs.python.org/2/library/stdtypes.html#numeric-types-int-float-long-complex
> on sequences: https://docs.python.org/2/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange
> on functions: https://docs.python.org/2/library/functions.html
>
> (A list is a sequence. There are other types of sequences, but
> the section on sequences, should give you some idea of how to play
> with lists.)
>
Martin: I have been using Python2 for several years now and I have yet
been able to change over to Python3. I am not together sure if Python3
is now more stable to use and more commonly use. If so, I will gradually
change over but do realize there is a learning curve to learn. It will
be slowly done but sooner or later, I will be using Python3. I wonder if
there is a script to translate my Python2 programs to Python3 format.
Hmm. I will some searching for such an animal. Hey, thanks for your
encouragement. Much appreciated.
Ken
More information about the Tutor
mailing list