Posts: 29
Threads: 10
Joined: Jun 2018
Aug-06-2018, 12:27 PM
(This post was last modified: Aug-06-2018, 01:53 PM by vanicci.)
[Help] Convert integer to Roman numerals? {Screenshot attached}
Hi,
Please see attached screenshot for the current exercise that I'm trying to execute?
[Image: 060818_zps7cdg6nrb.png]
Tbh, I am also unsure with my code. I gathered the idea from here ( https://stackoverflow.com/questions/2877...n-numerals)
===================================================================
Here's my currentcode:
print("[System] Hi! Enter any number between 1 and 3000 so the program will show you the old-school Roman numeral. In other words, 4 should return 'IIII'. Ready?!")
num_map = [(1000, 'M'), (500, 'D'), (100, 'C'), (50, 'L'), (10, 'X'), (5, 'V'), (1, 'I')]
num = int(input("Enter any number between 1 and 3000: "))
def num2roman(num):
while num > 0:
for key, val in num_map:
while num >= 1:
print(num_map.values())
num2roman(num) ===================================================================
Error:
Error: Traceback (most recent call last):
File "soc-wk1day4h-cert-vanessa-dunford.py", line 25, in <module>
num2roman(num)
File "soc-wk1day4h-cert-vanessa-dunford.py", line 24, in num2roman
print(num_map.values())
AttributeError: 'list' object has no attribute 'values'
===================================================================
Any advice is much appreciated! :)
Thank you in advance!
Posts: 566
Threads: 10
Joined: Apr 2017
For starters, you need a dict - not list of tuples
num_map = {1000: 'M', 500: 'D', 100: 'C', 50: 'L', 10: 'X', 5: 'V', 1: 'I'}
Test everything in a Python shell (iPython, Azure Notebook, etc.) - Someone gave you an advice you liked? Test it - maybe the advice was actually bad.
- Someone gave you an advice you think is bad? Test it before arguing - maybe it was good.
- You posted a claim that something you did not test works? Be prepared to eat your hat.
Posts: 544
Threads: 15
Joined: Oct 2016
List of tuples are fine. Just need to expand it.
roman_map = [(1000, "M"), (900, "CM"), (500, "D"), (400, "CD"), (100, "C"),
(90, "XC"), (50, "L"), (40, "XL"), (10, "X"), (9, "IX"), (5, "V"),
(4, "IV"), (1, "I")] Only have 1 loop.
def num2roman(num):
while num > 0: keep track of roman numeral
def num2roman(num):
numeral = ""
while num > 0: keep track where at in list.
def num2roman(num):
numeral = ""
pos = 0
while num > 0: in loop use if block to see if num > then value and - value from num. Else increase pos.
99 percent of computer problems exists between chair and keyboard.
Posts: 566
Threads: 10
Joined: Apr 2017
(Aug-06-2018, 02:07 PM)Windspar Wrote: List of tuples are fine. Just need to expand it.
I don't know what they thought when they created dict in Python  .
Really bright idea - propose un-Pythonic complicated mapping instead of standard dictionary
Test everything in a Python shell (iPython, Azure Notebook, etc.) - Someone gave you an advice you liked? Test it - maybe the advice was actually bad.
- Someone gave you an advice you think is bad? Test it before arguing - maybe it was good.
- You posted a claim that something you did not test works? Be prepared to eat your hat.
Posts: 4,220
Threads: 97
Joined: Sep 2016
The tuples are better than a dict. You need to subtract the numbers in order, and the list of tuples provides the order. I think it would be more pythonic to loop through the tuples rather than keep track of an index, but a dictionary is not the proper tool here.
Posts: 544
Threads: 15
Joined: Oct 2016
Aug-06-2018, 02:51 PM
(This post was last modified: Aug-06-2018, 03:06 PM by Windspar.)
@ volcano63
Walking through a list of tuples seem pretty elegant.
Since it not jumping around the list.
Saying something is un-Pythonic. Doesn't make it so.
Changing list to a tuple probably be better. Just because it keeps it all immutable.
roman_map = ((1000, "M"), (900, "CM"), (500, "D"), (400, "CD"), (100, "C"),
(90, "XC"), (50, "L"), (40, "XL"), (10, "X"), (9, "IX"), (5, "V"),
(4, "IV"), (1, "I")) But not a must.
99 percent of computer problems exists between chair and keyboard.
Posts: 29
Threads: 10
Joined: Jun 2018
@ volcano63 & @ ichabod801 = Thank you very much for your input! :)
@ Windspar, can I please ask you to look into my current code?
When user input's integer, there is no roman numeral coming up?
print("[System] Hi! Enter any number between 1 and 3000 so the program will show you the old-school Roman numeral. In other words, 4 should return 'IIII'. Ready?!")
num_map = [(1000, 'M'), (900, 'CM'), (500, 'D'), (400, 'CD'), (100, 'C'), (90, 'XC'),
(50, 'L'), (40, 'XL'), (10, 'X'), (9, 'IX'), (5, 'V'), (4, 'IV'), (1, 'I')]
result = int(input("Enter any number between 1 and 3000: "))
num = 0
def int_to_roman(num):
result = []
for (arabic, roman) in num_map:
(factor, num) = divmod(num, arabic)
result.append(roman * factor)
if num == 0:
break
return "".join(result)
int_to_roman(num) ===================================================================
My Terminal's Screenshot:
[Image: 060818_zpsmx8wa1rw.png]
Posts: 4,220
Threads: 97
Joined: Sep 2016
You need to print the result for it to show up on the screen. Change your last line to:
print(int_to_roman(num))
Posts: 544
Threads: 15
Joined: Oct 2016
Aug-06-2018, 04:32 PM
(This post was last modified: Aug-06-2018, 04:32 PM by Windspar.)
Try print(int_to_roman(int(result)))
99 percent of computer problems exists between chair and keyboard.
Posts: 4,220
Threads: 97
Joined: Sep 2016
She's covering using the same numeral multiple times with the divmod. Note to OP: that integer division (//) will give you the integer portion without the remainder, which you aren't using.
|