0

申し訳ありませんが、私の質問にはもっと適切なタイトルがあるような気がしますが、思いつきません。

基本的に、状況は次のとおりです。固定幅の情報テーブルを作成しています。キーのリストに k の (k,v) のリストがあります。

完了すると、「:」が行の中央に配置され、「|」が表示されます。左端と右端にあります。

私の問題は、長すぎて 1 行にまとめられないリストがいくつかあることです。リストがx文字になると、新しい行が開始され、テキストが同じレベルにインデントされるようにするか、そのようなエンコードされた多数の値を持つことができるようにする必要がありますそれらが同じ左パディング(またはコンテンツの「タブ付き」バージョンになるもの)に揃えること。

私がこれまでに持っているものの例:

def make_information_file(t):
    pairs=[("SERiES","Game of Thrones"),("SiZE","47,196,930,048 bytes"),(AUDiO TRACKS,['English: DTS-HD Master Audio 5.1', 'French: DTS 5.1', 'Spanish: DTS 5.1', 'Polish: DTS 2.0', 'Spanish: DTS 2.0'])]
    general_keys=["COLLECTiON NAME","UPC","RETAiL RELEASE DATE","REGiON","STUDiO"]
    video_keys=["ViDEO","SOURCE","RESOLUTiON","ASPECT RATiO"]
    audio_keys=["AUDiO FORMATS"]
    subtitle_keys=["SUBTiTLES"]
    all_keys=general_keys+video_keys+audio_keys+subtitle_keys
    longest_key=(sorted(all_keys,key=len) or [""])[-1]
    longest_key_length=len(longest_key)
    left_padding=longest_key_length+5
    right_padding=106-left_padding
    empty_left_padding=left_padding+3
    empty_right_padding=106-left_padding-3
    line_formatter=lambda p: "|{field:>{left_padding}} : {value:<{right_padding}}|".format(field=p[0],value=p[-1],left_padding=left_padding,right_padding=right_padding)

ここで、最長のキーの長さに応じて、「:」が固定ポイントに配置され、その両側に 1 つのスペースがあり、右のテキストが左に右揃えになるように、すべてが整列されていることに注意してください。左揃えで左に。

ただし、「AUDiO TRACKS」リストは長すぎて 1 行に収まりません。単語がその限界を超えてプッシュしようとしている場合は、自動的に分割することもできます (私の好みでは、2 行目 (およびそれ以降の行) は、最初の行とインラインに保つためにテキストをインデントする必要があると思います)行のテキスト. もう1つのオプションは、すべての値が左にempty_left_paddingで中央に配置され、その後に文字列値が続き、行の最終的な長さが標準の111文字の長さになるように十分な空白が続くようにすることです、最初と最後の文字として「|」を使用

desired_output=""""
|                  SERiES : Game of Thrones                                                                   |
|                    SiZE : 47,196,930,048 bytes                                                              |
|           AUDiO FORMATS : English: DTS-HD Master Audio 5.1, French: DTS 5.1, Spanish: DTS 5.1,              |
|                           Polish: DTS 2.0, Spanish: DTS 2.0                                                 |
|                     UPC : 883929191505                                                                      |
|     RETAiL RELEASE DATE : 03-06-2012                                                                        |
|                  REGiON : A, B, C                                                                           |
|                  STUDiO : HBO Home Video                                                                    |
|                   ViDEO : 1080p 1.78:1                                                                      |
|                  SOURCE : BD50                                                                              |
|              RESOLUTiON : 1080p                                                                             |
|            ASPECT RATiO : 16:9                                                                              |"""

そのため、上記の「AUDiO FORMATS」のケースに対処する方法がわかりません (利用可能な字幕のリストにも同じ問題があります)。

4

2 に答える 2

3

最初に: 情報を順序付き辞書に保存して、その順序を維持し、キーと値のペアに編成されたデータを取得します。

import collections

d = collections.OrderedDict([
    ('SERiES', 'Game of Thrones'),
    ('SiZE', '47,196,930,048 bytes'),
    ('AUDiO FORMATS', 'English: DTS-HD Master Audio 5.1, French: DTS 5.1, Spanish: DTS 5.1, Polish: DTS 2.0, Spanish: DTS 2.0'),
    ('UPC', '883929191505'),
    ('RETAiL RELEASE DATE', '03-06-2012'),
    ('REGiON', 'A, B, C'),
    ('STUDiO', 'HBO Home Video'),
    ('ViDEO', '1080p 1.78:1'),
    ('SOURCE', 'BD50'),
    ('RESOLUTiON', '1080p'),
    ('ASPECT RATiO', '16:9')
])

2番目: 指定された列の長さで単語全体のみをラップするには、ワードラッパーが必要です。

def word_wrap(string, width=80, indent=4, tab=True):
    output = list()
    for ln in string.replace('\t', ' ' * indent).split('\n'):
        line = list()
        for wd in ln.split(' '):
            if len(' '.join(line) + ' ' + wd) > width:
                output.append(' '.join(line))
                line = list()
            line.append(wd)
        output.append(' '.join(line))
    return [l.replace(' ' * indent, '\t') for l in output] if tab else output

3 番目: セパレータ、テキスト全体の幅、テキストの前のパディング スペース、セパレータの前後のスペースを設定できる辞書フォーマッタが必要です。

def format_dict(dictionary, sep=':', width=80, pad=2, pre=1, post=1):
    max_len   = max(len(k) for k in dictionary)
    para_pad  = '%s%s' % ('\n', (pad + max_len + pre + len(sep) + post)*' ')
    separator = '%s%s%s' % (pre*' ', sep, post*' ')
    output = list()
    for key, value in dictionary.iteritems():
        output.append(
            '%s%s%s' % (
                '%s%s' % ((max_len + pad - len(key))*' ', key),
                separator,
                para_pad.join(word_wrap(str(value), width - len(para_pad)))
            )
        )
    return [''.join(l) for l in output]

4 番目: 段落の左側と右側を飾ります。

def decorate_para(string, deco='|', width=80):
    output = list()
    for line in string.split('\n'):
        output.append('%s%s%s%s' % (deco, line, (width - len(line))*' ', deco))
    return '\n'.join(output)

5番目: 出力を印刷してテストします:

w = 79
print decorate_para('\n'.join(format_dict(d, width=w - 2)), width=w)

そして出来上がり!出力は次のとおりです。

|               SERiES : Game of Thrones                                        |
|                 SiZE : 47,196,930,048 bytes                                   |
|        AUDiO FORMATS : English: DTS-HD Master Audio 5.1, French: DTS 5.1,     |
|                        Spanish: DTS 5.1, Polish: DTS 2.0, Spanish: DTS 2.0    |
|                  UPC : 883929191505                                           |
|  RETAiL RELEASE DATE : 03-06-2012                                             |
|               REGiON : A, B, C                                                |
|               STUDiO : HBO Home Video                                         |
|                ViDEO : 1080p 1.78:1                                           |
|               SOURCE : BD50                                                   |
|           RESOLUTiON : 1080p                                                  |
|         ASPECT RATiO : 16:9                                                   |
于 2013-06-19T10:58:08.117 に答える
1

役立つヒントを次に示します。

ペアをdictとして保存します。これは、リストを使用するよりも直感的であり、後で便利になります

pairs = dict([("SERiES","Game of Thrones"),("SiZE","47,196,930,048 bytes"),
('AUDiO TRACKS',['English: DTS-HD Master Audio 5.1', 'French: DTS 5.1', 
'Spanish: DTS 5.1', 'Polish: DTS 2.0', 'Spanish: DTS 2.0'])])

キーの最大長を取得するには、max組み込みメソッドを使用します。

longest_key = max(pairs.keys(), key=len)
longest_key_length=len(longest_key)

文字列を右揃えにするには、文字列関数str.rjustを使用します。

left_padding = longest_key_length + 5
for k in pairs.keys():
    print '|' + (k + ' : ').rjust(left_padding)

文字列をスペースで埋めるには、文字列関数str.ljustを使用して固定します

max_l = 105
max_right = max_l - left_padding 
for k, v in pairs.items():
    left = '|' + (k + ' : ').rjust(left_padding)   
    right = str(v) if len(str(v)) < max_right else ''
    right = right.ljust(max_right) + '|'
    print left + right

最後に、textwrapライブラリを使用して段落をラップするか、この種のものにはより高度なライブラリを使用できます

center、capitalize、title などの他の文字列メソッドを使用することもできます...

これで、すべてをうまく進めることができるはずです。

于 2013-06-19T10:33:29.993 に答える