2013-03-21 67 views
1
tala = int(input('Skrifaðu magn af pening-->')) 
if tala >= 0: 
    fth = int(tala/5000) 
    remains = tala % 5000 
    tth = int(remains/2000) 
    remains = remains % 2000 
    th = int(remains/1000) 
    remains = remains % 1000 
    fhr = int(remains/500) 
    remains = remains % 500 
    hdr = int(remains/100) 
    remains = remains % 100 
    fty = int(remains/50) 
    remains = remains % 50 
    ten = int(remains/10) 
    remains = remains % 10 
    fiv = int(remains/5) 
    remains = remains % 5 
    one = int(remains/1) 
    print(d[tala]) 

打印的部分是問題 我不熟悉的語法的主要焦點,但這一計劃是使用字典,以避免噸,如果是要告訴的代碼做什麼,如果數量超過5000,或者如果它大於2000大等 基本上我腦子裏想的是這樣的(無效的語法OFC)試圖縮短我的代碼字典

d = {} 
##d[Value between 0 and 4] or d[value between 5 and 9] etc. 
d[0-4] = ("That would be {0} Krónur.".format(one)) 
d[5-9] = ("That would be {1} Fimmkallar and {0} Krónur.".format(one,fiv)) 
d[10-49] = ("That would be {2} Tíkallar, {1} Fimmkallar and {0} Krónur.".format(one,fiv,ten)) 
d[50-99] = ("That would be {3} Fimmtíukallar, {2} Tíkallar, {1} Fimmkallar and {0} Krónur.".format(one,fiv,ten,fty)) 

如果你想知道這是什麼碼正在做,是如果我說輸入更高的價值t韓5000

它會分裂下來(sortof像ATM)給它多少次是5000法案,2000法案,1000法案,500法案,100枚硬幣等

它是一所學校的項目解決各地%符號的使用(這是針對C#做然而,但我通過做在Python我的C#分配學習Python)的

的主要問題是:如果那裏有一種方法,使該字典的工作作風我愛知道如何。 第二個問題是: 如果這是一個更好的方法來做到這一點,我很樂意聽到你的想法。 如果我應該這樣做(或其中的一部分)一些其他方式,不會傷害知道。

編輯:我發現了一個半功能的解決方案,但它不完全漂亮。然而,這是一個很多比我更另類可讀性,所以它比沒有好,沒有任何人有一個更好的主意比這?:

#Dictionary START 
    if tala < 5: 
     num = 0 
    elif tala < 10: 
     num = 1 
    elif tala < 50: 
     num = 2 
    elif tala < 100: 
     num = 3 
    d = {} 
    d[0] =("Það eru {0} Krónur.".format(one)) 
    d[1] =("Það eru {1} Fimmkallar og {0} Krónur.".format(one,fiv)) 
    ... 
#Dictionary END 
    print(d[num]) 
+1

我發現了一個半功能soluton,這是使如果森泰斯和一個新的變量 (例如) 如果塔拉<5: NUM = 0 elif的塔拉<10: NUM = 1 然後使 d [NUM]代替d [塔拉] 不是令人滿意的解決方案,但我認爲它看起來比如果不使用字典作爲最終結果我被方式漂亮(我也刪除了逗號和替換的字符串格式) – Rabcor 2013-03-21 14:36:38

回答

0

首先,創建一個字典單位的名稱映射到前面提取的值:

d = {"Kronur": one, "Tikallar": ten, "Fimmtiukallar": fty, ...} 

您可以使用collections.OrderedDict來保存項目添加到詞典的順序。然而,正如其他人所指出的,使用一個元組列表可能比快速隨機存取更好,因爲你更關心順序:

d = [..., ("Tikallar", ten), ("Fimmkallar", fiv), ("Kronur", one)] 

現在,你可以循環遍歷字典(項目那些不0)並將它們連接成長字符串。 (當使用元組的列表,使用for (key, val) in d代替for (key, val) in d.items()

def get_string(d): 
    s = "That would be " 
    not_zero = [(key, val) for (key, val) in d.items() if val > 0] 
    for i, (key, val) in enumerate(not_zero): 
     if i > 0: 
      s += ", " if i < len(not_zero)-1 else " and " 
     s += "%d %s" % (val, key) 
    s += "." 
    return s 

輸出示例:

>>> d = {"Kronur": 4, "Tikallar": 0, "Fimmtiukallar": 2} 
>>> print get_string(d) 
"That would be 2 Fimmtiukallar and 4 Kronur." 
+0

這正是我正在尋找的東西,但我很難讓這些值以正確的順序產生。說 輸出:這將是1個fimmkall,4克朗,2hundraðkallar和1fimmtíukall - 但應該是:這將是2hundraðkallar,1個fimmtíkuall,1個fimmkall和4克朗 如何解決? – Rabcor 2013-03-22 15:13:25

+0

@Rabcor正如我所說的,您可能想要使用OrderedDict並按您希望打印的順序插入值。然而,正如其他人指出的那樣,使用元組列表而不是字典可能更明智一些,因爲您關心的是順序,而不是快速的隨機訪問。 – 2013-03-22 15:25:34

0

如果您首先確定你的所有面額的列表,然後,你可以使用for循環遍歷每個教派,然後使用列表理解輸出一個子字符串數組。這裏有一些測試的例子。

#specify array containing denominations as a tuple, amount and name 
denominations = [(5000, 'five thousand'), (2000, 'two thousand'), (1000, 'five thousand'), (500, 'five hundred'), (100, 'one hundred')] 

def print_break_down(total): 

    counts = [] 
    for denomination in denominations: 
     counts.append(total/ denomination[0]) 
     total = total % denomination[0] 

    main = ' and '.join(['%s %s' %(count, denominations[i][1]) for i, count in enumerate(counts) if count>0]) 
    print 'That would be %s' % main 

print_break_down(15000) 
print_break_down(15100) 
print_break_down(5300) 
print_break_down(4000) 
print_break_down(1600) 
print_break_down(600) 
print_break_down(100) 
0

這應該工作,只要你想,沒有使用dict因爲不使用查找這樣的 dict的優勢將不復存在

def test_func(value): 
    """ 
     >>> test_func(0) 
     'That would be 0 Kronur.' 

     >>> test_func(4) 
     'That would be 4 Kronur.' 

     >>> test_func(5) 
     'That would be 1 Fimmkallar and 0 Kronur.' 

     >>> test_func(15) 
     'That would be 1 Tikallar, 1 Fimmkallar and 0 Kronur.' 

     >>> test_func(47) 
     'That would be 2 Fimmtiukallar, 0 Tikallar, 1 Fimmkallar and 2 Kronur.' 
    """ 
    twenty = value/20 
    ten = (value - twenty * 20)/10 
    five = (value - twenty * 20 - ten * 10)/5 
    one = (value - twenty * 20 - ten * 10 - five * 5) 
    ranges = [((0, 5), 'That would be {0} Kronur.'), 
       ((5, 10), 'That would be {1} Fimmkallar and {0} Kronur.'), 
       ((10, 20), 'That would be {2} Tikallar, {1} Fimmkallar and ' 
         '{0} Kronur.'), 
       ((20, 50), 'That would be {3} Fimmtiukallar, {2} Tikallar, ' 
         '{1} Fimmkallar and {0} Kronur.')] 
    text = next(v for r, v in ranges if r[0] <= value < r[1]) 
    return text.format(one, five, ten, twenty) 

http://docs.python.org/2/library/doctest.html