Python Forum
Sorting list of lists with string and int
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Sorting list of lists with string and int
#1
So I'm trying to solve this exercise: https://open.kattis.com/problems/cups

Although the problem is simple and does not require much work I'd like to improve my code because it looks pretty bad:

#!/usr/bin/python3

n = int(input())

a = [input().split() for i in range(n)]

for i in a:
    if(i[0].isdigit()):
        i[0] = int(i[0])/2
        i[1], i[0] = i[0], i[1]
    elif(i[1].isdigit()):
        i[1] = int(i[1])

a.sort(key=lambda x: x[1])
[print(i[0]) for i in a]
The main concern is that I don't know if the string will be in a form int string or string int so I need to check for it.
Reply
#2
You could use
for i in a:
    try:
        i[1] = int(i[1])
    except ValueError:
        i[0], i[1] = i[1], int(i[0]) / 2
Reply
#3
Why do we need to be explicit and write except ValueError?
Reply
#4
(May-06-2018, 11:42 AM)Otbredbaron Wrote: Why do we need to be explicit and write except ValueError?
I'm not sure I understand exactly what you mean, but here I know that if i[1] contains anything that is not convertible to an integer the call to int() will raise ValueError. In such a case, I always catch the exact exception because I don't want to catch anything else. For example if for some reason there is no i[1], python will throw KeyError and I don't want to catch this at this point. For debugging purposes, it is always better to let unexpected exceptions propagate.
Reply
#5
actually, the easiest way would be to add sorted to your line 5 list comprehension

a = [sorted(input().split()) for i in range(n)]
this way you always get the number as element with index 0 because when sorting '0' to '9' always go before 'A'

def parse_data(item):
    return (int(item[0]), item[1])


data = ['red 10', '10 blue', 'green 7']
data = [parse_data(sorted(item.split())) for item in data]
output = [cup for radius, cup in sorted(data)]
print('\n'.join(output))
note that sample output in your assignment is NOT correct
If you can't explain it to a six year old, you don't understand it yourself, Albert Einstein
How to Ask Questions The Smart Way: link and another link
Create MCV example
Debug small programs

Reply
#6
(May-07-2018, 05:38 AM)buran Wrote: actually, the easiest way would be to add sorted to your line 5 list comprehension

a = [sorted(input().split()) for i in range(n)]
this way you always get the number as element with index 0 because when sorting '0' to '9' always go before 'A'

def parse_data(item):
    return (int(item[0]), item[1])


data = ['red 10', '10 blue', 'green 7']
data = [parse_data(sorted(item.split())) for item in data]
output = [cup for radius, cup in sorted(data)]
print('\n'.join(output))
note that sample output in your assignment is NOT correct

It is correct because if it's in the format number color, then number need to be divided by 2 so it will be 5.

(May-06-2018, 02:26 PM)Gribouillis Wrote:
(May-06-2018, 11:42 AM)Otbredbaron Wrote: Why do we need to be explicit and write except ValueError?
I'm not sure I understand exactly what you mean, but here I know that if i[1] contains anything that is not convertible to an integer the call to int() will raise ValueError. In such a case, I always catch the exact exception because I don't want to catch anything else. For example if for some reason there is no i[1], python will throw KeyError and I don't want to catch this at this point. For debugging purposes, it is always better to let unexpected exceptions propagate.

I see now, I need to get used to this try except thing.
Reply
#7
(May-07-2018, 05:54 AM)Otbredbaron Wrote: if it's in the format number color, then number need to be divided by 2 so it will be 5.
sorry, didn't notice that - my mistake
def parse_data(item):
    try:
        return int(item[0])/2, item[1]
    except ValueError:
        return (int(item[1]), item[0])


data = ['red 10', '10 blue', 'green 7']
data = [parse_data(item.split()) for item in data]
output = sorted([cup for radius, cup in data])
print('\n'.join(output))
and if you are comfortable with
def parse_data(item):
    item = item.split()
    try:
        return int(item[0])/2, item[1]
    except ValueError:
        return (int(item[1]), item[0])


data = ['red 10', '10 blue', 'green 7']
print('\n'.join(sorted([cup for radius, cup in map(parse_data, data)])))
If you can't explain it to a six year old, you don't understand it yourself, Albert Einstein
How to Ask Questions The Smart Way: link and another link
Create MCV example
Debug small programs

Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Need help with sorting lists as a beginner Realist1c 1 711 Apr-25-2023, 04:32 AM
Last Post: deanhystad
  List all possibilities of a nested-list by flattened lists sparkt 1 878 Feb-23-2023, 02:21 PM
Last Post: sparkt
  user input values into list of lists tauros73 3 1,023 Dec-29-2022, 05:54 PM
Last Post: deanhystad
  returning a List of Lists nafshar 3 1,014 Oct-28-2022, 06:28 PM
Last Post: deanhystad
  Creating list of lists, with objects from lists sgrinderud 7 1,561 Oct-01-2022, 07:15 PM
Last Post: Skaperen
  List Sorting Problem ZZTurn 5 1,280 Sep-22-2022, 11:23 PM
Last Post: ZZTurn
  Sorting List finndude 9 2,390 Jan-27-2022, 09:37 PM
Last Post: Pedroski55
  How to efficiently average same entries of lists in a list xquad 5 2,069 Dec-17-2021, 04:44 PM
Last Post: xquad
  sorting a list of lists by an element leapcfm 3 1,805 Sep-10-2021, 03:33 PM
Last Post: leapcfm
  Generate a string of words for multiple lists of words in txt files in order. AnicraftPlayz 2 2,756 Aug-11-2021, 03:45 PM
Last Post: jamesaarr

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020