1

私は次のことを行うPythonスクリプトを作成しようとしています:

テーブル(dbfまたはcsv-どちらでも作成できます)には、常に4つのレコードしかありません。列2(Let)は、常にa、b、c、dの順序になります。列1(数値)の数値は常に0から10の間ですが、頻度と順序は異なります。出力は、最初に出力される最小の数でNumによってソートおよびグループ化する必要があります。最初の列の数字が1回表示されると、対応する文字だけが出力されます。数字が2回現れる場合(つまり、2つの行が同じ数字である場合)、対応する各文字は、それらの間に「and」を付けて出力されます。数字が2回以上表示される場合、各文字は、それらの間にコンマを入れ、最後の文字の前に「and」を付けて出力されます。表示される各文字グループは、独自の出力行を取得します。

基本的に、4つのオプションのうちの1つを並べ替え、グループ化し、出力することを検討しています。

「データなし」
1文字自体
「and」で区切られた2文字
コンマで区切られた3文字と最後の文字の前の「and」

以下は、soils_no.dbfと呼ばれるテーブルのさまざまなバージョンと、入力に応じた望ましい出力です。

番号.......... 0...............
a
0 ............... b
0 .. .. ............ c
0...............d
印刷「データなし」

番号..........
8............... a
8 ............... b
2 .. .. ............ c
8 ............... d
print c
print a、b、d

番号..........
4............... a
1 ............... b
7 .. .. ............ c
3...............d
印刷b
印刷d
印刷
印刷c

番号..........
3............... a
3 ............... b
10 .. .. .......... c
1...............d
印刷d
印刷aおよびb
印刷c

番号.......... 10...............
a
10 ............... b
10 .. .. ............ c
10 ............... d
印刷a、b、c、およびd

ループしてコンマと「and」を入れる方法は知っていますが、グループ化して並べ替える方法がわかりません。Python2.7でこれを行う。

ところで、私はPythonを学ぼうとしているので、コードの意味を説明してください。学べば学ぶほど、見知らぬ人の優しさに頼ることは少なくなります。

事前に何億もの感謝を。

4

1 に答える 1

1

以下の議論。

from collections import defaultdict

def pretty_print_lst(lst):
    if not lst:
        return ""
    elif len(lst) == 1:
        return lst[0]
    elif len(lst) == 2:
        # Join together two letters using " and " as the join.
        return " and ".join(lst)
    else:
        # Use a "list slice" to join all in the list but the last item,
        # using ", " as the join, then append " and " and append the
        # last item.  Last item is indexed with -1, which always works no
        # matter how many or few items are in the list.
        return ", ".join(lst[:-1]) + " and " + lst[-1]

def print_rec(seq):
    # group according to counts
    d = defaultdict(list)
    for row in seq:
        n, letter = row  # get count and letter from the row
        d[n] += letter  # append letter to that count list

    # get a list of (key, value) pairs
    # so the list entries are: (count, list_of_letters)
    results = list(d.items())
    results.sort()
    if len(results) == 1 and results[0][0] == 0:
        # if all 4 letters have a count of 0, 
        print("No data")
    else:
        for count, lst in results:
            s = pretty_print_lst(lst)
            print(s)

lst = [ (8, 'a'), (8, 'b'), (2, 'c'), (8, 'd')]
print_rec(lst)

辞書を使用して、同じ数のアイテムを収集します。これは「defaultdict」です。存在しないキーを参照するときはいつでも、この場合は空のリストで作成されます。したがって、値を追加するだけで、dictが空であるかどうかは関係ありません。

次に、ゼロ以外のアイテムを収集してリストを作成し、希望の形式に一致するようにリストをきれいに印刷します。

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2013-02-28T01:47:23.957 に答える