class RomanNumerals():
def __init__(self,number):
self.num = number
def from_roman(self):
int_num=0
rom = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
i=0
while (i<len(self.num)):
if(i+1==len(self.num)):
int_num+=rom[self.num[i]]
break
else:
if (rom[self.num[i]]<rom[self.num[i+1]]):
int_num+=rom[self.num[i+1]]-rom[self.num[i]]
i+=2
else:
int_num+=rom[self.num[i]]
i+=1
return int_num
def to_roman(self):
val = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1)
syb = ('M', 'CM', 'D', 'CD','C', 'XC','L','XL','X','IX','V','IV','I')
roman_num = ""
for i in range(len(val)):
count = int(self.num / val[i])
roman_num += syb[i]*int(count)
self.num -= val[i] * count
return roman_num
我打电话给RomanNumerals.to_roman (1000)
- 它给出了一个错误:
AttributeError: object 'int' does not have attribute 'num'
我的代码没有通过测试,尽管一切都对我有用。请告诉我在哪里挖掘以弄清楚。
如果你打电话给RomanNumerals.to_roman (1000)
那么你通过 1000 作为self
。但self
应该是类的一个实例。
to_roman
是一个实例方法,您应该在类的实例上调用它。
r = RomanNumerals(1000)
print(r.to_roman())
(尽管我在from_roman
中指出,您似乎希望self.num
是一个字符串或列表,这与您在to_roman
中处理它的方式不一致。
或者,如果您只是将to_roman
用作独立函数,那么您应该删除类并编写to_roman
以接受参数作为纯整数。
我非常了解这一点,所以我检查了班级的表现。这是Codewars的任务,在测试中有这样的测试:
RomanNumerals.to_roman (1000)
我知道为这个任务编写一个函数更容易,但任务指出你需要写一个类,测试是通过这样一个奇怪的请求进行的。
我想通了。这是我问题的代码:
class RomanNumerals():
def from_roman(num_rom):
int_num=0
rom = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
i=0
while (i<len(num_rom)):
if(i+1==len(num_rom)):
int_num+=rom[num_rom[i]]
break
else:
if (rom[num_rom[i]]<rom[num_rom[i+1]]):
int_num+=rom[num_rom[i+1]]-rom[num_rom[i]]
i+=2
else:
int_num+=rom[num_rom[i]]
i+=1
return int_num
def to_roman(num_ar):
val = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1)
syb = ('M', 'CM', 'D', 'CD','C', 'XC','L','XL','X','IX','V','IV','I')
roman_num = ""
for i in range(len(val)):
count = int(num_ar / val[i])
roman_num += syb[i]*int(count)
num_ar -= val[i] * count
return roman_num
print(RomanNumerals.to_roman(1000))
我没想到他们会开始减去我。创建这个网站似乎是为了帮助和解释不太合格的人......
更优雅的求解方式:
class Solution(object):
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
roman = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000,'IV':4,'IX':9,'XL':40,'XC':90,'CD':400,'CM':900}
i = 0
num = 0
while i < len(s):
if i+1<len(s) and s[i:i+2] in roman:
num+=roman[s[i:i+2]]
i+=2
else:
#print(i)
num+=roman[s[i]]
i+=1
return num
ob1 = Solution()
print(ob1.romanToInt("III"))
print(ob1.romanToInt("CDXLIII"))