[英]List comprehension for int to roman numeral
我有一個函數roman(x)
,它接受一個int
( >= 1
)並將羅馬數字作為字符串返回。 我已經實現了一個工作示例:
def roman(x: int) -> str:
"""Convert `int` to roman numeral"""
L = [(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')]
y = ""
for val, sym in L:
y += sym*(x//val)
x -= val*(x//val)
return y
>>> roman(399)
'CCCXCIX'
我在問如何轉換 for 循環:
y = ""
for val, sym in L:
y += sym*(x//val)
x -= val*(x//val)
return y
進入列表理解
return "".join([ ... ])
L
不需要嵌入到列表推導中,可以保持原樣。 使得函數是這種形式:
def roman(x: int) -> str:
"""Convert into to roman numeral"""
L = [(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')]
# Return list comprehension as a string
return "".join([ ... ])
如果您不介意遞歸,這實際上是一個非常好的用例。
L = [(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')]
def roman(num):
if num == 0: # Base case: when we reach zero, return empty string
return ''
# Recursive step: iterate over values and their characters
for v, n in L:
if num >= v: # If their difference is positive, we recurse
return n + roman(num - v) # We append the result to the numeral
roman(399)
>> 'CCCXCIX'
def roman(x: int) -> str:
"""Convert into to roman numeral"""
L = [(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')]
return ''.join([(sym*(x//val), (x:=x-val*(x//val)))[0] for val, sym in L])
print(roman(399)) # CCCXCIX
使用functools.reduce
的版本
from functools import reduce
def roman(x: int) -> str:
"""Convert into to roman numeral"""
L = [(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')]
return reduce(lambda s, c: (s[0] + c[1]*(s[1]//c[0]), s[1] - c[0]*(s[1]//c[0])), L, ("", x))[0]
print(roman(399)) # CCCXCIX
很嚇人,看不懂。 不要使用它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.