Posts: 16
Threads: 6
Joined: Jun 2019
The task is :
Write a function called is_sorted that takes a list as a parameter and returns True if the list is sorted in ascending order and False otherwise. For example:
>>> is_sorted([1, 2, 2])
True
>>> is_sorted(['b', 'a'])
False
My code is :
def is_sorted(a):
for i in range(len(a)-1):
if a[i]<=a[i+1]:
return True
return False When I try:
is_sorted([1,2,3,4,0,5,6])
the answer is True which is not correct! Why?
We see a[3]=4 and a[4]=0 which is not True. So why it gives me True?
Posts: 2,168
Threads: 35
Joined: Sep 2016
Jun-16-2019, 05:24 PM
(This post was last modified: Jun-16-2019, 05:24 PM by Yoriz.)
The first check for comparison it does is, 1 is equal to or less than 2 which is true so it stops.
You need to learn to add print statements to see whats happening in yours code.
def is_sorted(a):
for i in range(len(a)-1):
print(a[i], a[i+1])
if a[i]<=a[i+1]:
return True
return False
print(is_sorted([1,2,3,4,0,5,6])) Output: 1 2
True
Posts: 16
Threads: 6
Joined: Jun 2019
(Jun-16-2019, 05:21 PM)Yoriz Wrote: The first check for comparison it does is, 1 is equal to or less than 2 which is true so it stops.
But doesn't it go through the whole loop?
Posts: 2,168
Threads: 35
Joined: Sep 2016
It wont, your code says as soon as it finds a[i]<=a[i+1] return True
Posts: 16
Threads: 6
Joined: Jun 2019
(Jun-16-2019, 05:28 PM)Yoriz Wrote: It wont, your code says as soon as it finds a[i]<=a[i+1] return True
So I see if I write:
def is_sorted(l):
for i in range(len(l)-1):
print(l[i],l[i+1])
if l[i]>l[i+1]:
return False
return True It works ! and it will go through the whole loop!
Posts: 135
Threads: 0
Joined: Jun 2019
Jun-16-2019, 05:42 PM
(This post was last modified: Jun-16-2019, 05:43 PM by noisefloor.)
Hi,
@ppoyan89: iterating over an iterable with for x in range(len(iterable)) is still a bad anti-pattern. Don't you have any motivation to use what you learned before?
Except this, this is solvable without iteration but by the build-in function sorted :
def is_sorted(iterable):
return iterable == sorted(iterable) Regards, noisefloor
Posts: 16
Threads: 6
Joined: Jun 2019
(Jun-16-2019, 05:42 PM)noisefloor Wrote: Hi,
@ppoyan89: iterating over an iterable with for x in range(len(iterable)) is still a bad anti-pattern. Don't you have any motivation to use what you learned before?
Except this, this is solvable without iteration but by the build-in function sorted :
def is_sorted(iterable):
return iterable == sorted(iterable) Regards, noisefloor
Hi!
I am not a very good programmer and had not a very good teacher! but at all cost I am trying to learn the base of programming... that is because I use this. It seems much more easier for me to write for example:
for i in range(len(a))
But you say it is a bad pattern for looping through a list ?
Posts: 135
Threads: 0
Joined: Jun 2019
Hi,
Quote: But you say it is a bad pattern for looping through a list ?
Because it's a useless anti-pattern. Python can iterate directly over iterables. I explained that to you earlier (I think yesterday?) in another one of your "need help on homework" thrads in detail. So have a look there, I will not repeat here again.
In case you want to learn proper Python: work yourself through the official tutorial at docs.python.org
Regards, noisefloor
Posts: 2,125
Threads: 11
Joined: May 2017
from itertools import tee
def last_current(iterable):
"""
Takes any kind of iterable and
returns a interator which yields
last and current element
"""
last, current = tee(iterable)
next(current)
return zip(last, current)
def is_sorted(sequence):
"""
Consumes any kind of sequences, also
Generators, which can be consumed only one time
and do not have index access.
"""
for last, current in last_current(sequence):
if last > current:
return False
return True
Pedroski55 likes this post
Posts: 1,950
Threads: 8
Joined: Jun 2018
(Jun-16-2019, 05:52 PM)pooyan89 Wrote: I am not a very good programmer and had not a very good teacher! but at all cost I am trying to learn the base of programming... that is because I use this. It seems much more easier for me to write for example:
for i in range(len(a))
But you say it is a bad pattern for looping through a list ?
One of the reasons why for i in range(len(a)) is considered antipattern is that integer is usually used to access list elements by index. You don't need to do it in Python, as noisefloor pointed out you can iterate directly over list element without need to mess with access by indices. However, if you need integer then you should use enumerate.
If you want to learn fundamentals then you should not go for 'more easier for me to write' but 'what are the best practices' and 'why are they considered best practices'
One easy to understand and well presented material is Ned Batchelder Loop Like a Native
I'm not 'in'-sane. Indeed, I am so far 'out' of sane that you appear a tiny blip on the distant coast of sanity. Bucky Katt, Get Fuzzy
Da Bishop: There's a dead bishop on the landing. I don't know who keeps bringing them in here. ....but society is to blame.
|