2016-11-22 22 views
3

我有一个程序,我创建的转换为罗马数字,它的工作成功。现在我试图添加用​​转换为希腊数字的想法,它不会通过列表中的第一个元组:("α", 1)。我使用的是我用来转换为罗马字母的相同算法,但由于某种原因,它不适用于我的希腊语?为什么这不能像我预期的那样工作?转换为希腊数字将无法正常工作

# <~~ coding=utf-8 ~~> 
import argparse 


opts = argparse.ArgumentParser() 
opts.add_argument("-g", "--greek", type=int, 
        help="Convert to Medieval Numerals") 
opts.add_argument("-r", "--roman", type=int, 
        help="Convert to Roman Numerals") 
args = opts.parse_args() 


ROMAN_NUMERAL_TABLE = [ 
    ("~M", 1000000), ("~D", 500000), ("~C", 100000), 
    ("~L", 50000), ("~X", 10000), ("~V", 5000), # "~" indicates a Macron 
    ("M", 1000), ("CM", 900), ("D", 500), 
    ("CD", 400), ("C", 100), ("XC", 90), 
    ("L", 50), ("XL", 40), ("X", 10), 
    ("IX", 9), ("V", 5), ("IV", 4), 
    ("I", 1) 
] 


GREEK_NUMERAL_TABLE = [ 
    ("α", 1), ("β", 2), ("γ", 3), 
    ("δ", 4), ("ε", 5), ("Ϝ", 6), 
    ("ζ", 7), ("η", 8), ("θ", 9), 
    ("ι", 10), ("κ", 20), ("λ", 30), 
    ("μ", 40), ("ν", 50), ("ξ", 60), 
    ("ο", 70), ("π", 80), ("ϙ", 90), 
    ("ρ", 100), ("σ", 200), ("τ", 300), 
    ("υ", 400), ("φ", 500), ("χ", 600), 
    ("ψ", 700), ("ω", 800), ("ϡ͵", 900), 
    ("α", 1000), ("β", 2000), ("γ", 3000), 
    ("δ", 4000), ("ε", 5000), ("ϛ", 6000), 
    ("ζ", 7000), ("η", 8000), ("θ", 9000) # The Greeks weren't very creative 
] 


def convert_init(number, convert_to=None): 
    display_numerals = [] 

    for numeral, value in convert_to: 
     count = number // value 
     number -= count * value 
     display_numerals.append(numeral * count) 

    return ''.join(display_numerals) 


if __name__ == '__main__': 
    if args.greek: 
     data = convert_init(int(args.greek), convert_to=GREEK_NUMERAL_TABLE) 
     with open("greek_numerals.txt", "a+") as file_data: 
      file_data.write(data) 

    elif args.roman: 
     data = convert_init(int(args.roman), convert_to=ROMAN_NUMERAL_TABLE) 
     with open("roman_numerals.txt", "a+") as file_data: 
      file_data.write(data) 

    else: 
     raise NotImplementedError("{} is not implemented yet".format(args)) 

输出罗马数字:

124542 
~C~X~XMMMMDXLII # Works 

输出为希腊数字:

124542 
ααααααααααααααααααααααααααααααααααααααααααααααααααααα # Only outputs the 1 
... 
+5

它看起来像这个问题可能是希腊列表是按升序排列,而您的罗马列表下降。 – NonlinearFruit

+0

对于希腊语,在第一次迭代中count = number //值,结果将是实际的数字,因为第一个值是1.然后数字变为零。所以如果你把它们按降序排列,它应该可以工作。 –

+0

此外,如果数字变为0,则应该停止for循环。 –

回答

3

希腊列表是按升序排列,而罗马是按降序排列。

这将导致希腊处理的第一个数字,是1,所以它打印的,而不是先降更大的数字n倍信α

所以,当你重复它只是排序列表下降:

for numeral, value in convert_to: # Becomes: 
for numeral, value in sorted(convert_to)[::-1]: 
+0

没有办法,这是简单的大声笑 – papasmurf

相关问题