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 より大きい場合、または 5000 より大きい場合に何をすべきかをコードに伝えるために、大量の if を作成することを避けるために dict を使用することでした。 2000 など。基本的には、このようなことを念頭に置いていました (無効な構文の c)

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))

このコードが何をしているのか知りたい場合は、5000 より大きい値を入力してください。

5000 紙幣、2000 紙幣、1000 紙幣、500 紙幣、100 コインなどに分割します (ATM のようなものです)。

これは、% 記号の使用法を解決する学校のプロジェクトでした (ただし、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])
4

3 に答える 3

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."
于 2013-03-21T14:50:07.997 に答える
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)
于 2013-03-21T15:09:22.387 に答える