簡體   English   中英

對 int 到羅馬數字的列表理解

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM