5

How to split an iterable in constant-size chunks のように Python リストをチャンクに分割する方法に関するいくつかの素晴らしい投稿をここで見ます。ほとんどの投稿では、チャンクを分割するか、リスト内のすべての文字列を結合してから、通常のスライス ルーチンに基づいて制限します。

ただし、文字制限に基づいて同様のことを実行する必要がありました。文のリストがあるが、リスト内のスライスを切り捨てることができない場合。

ここでいくつかのコードを大量生産することができました:

def _splicegen(maxchars, stringlist):
    """
    Return a list of slices to print based on maxchars string-length boundary.
    """
    count = 0  # start at 0
    slices = []  # master list to append slices to.
    tmpslices = []  # tmp list where we append slice numbers.

    for i, each in enumerate(stringlist):
        itemlength = len(each)
        runningcount = count + itemlength
        if runningcount < int(maxchars):
            count = runningcount
            tmpslices.append(i)
        elif runningcount > int(maxchars):
            slices.append(tmpslices)
            tmpslices = []
            count = 0 + itemlength
            tmpslices.append(i)
        if i==len(stringlist)-1:
            slices.append(tmpslices)
    return slices

出力は次のようなものを返す必要があります: Slices is: [[0, 1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13], [14, 15, 16, 17, 18, 19, 20]] (各番号は stringlist の項目を参照します)

したがって、このリストのリストを繰り返し処理するときに、"".join([item for item in each]) のようなものを使用して、1 行に 0,1,2,3,4,5,6、7、別の 8,9,10,11,12,13。場合によっては、リストが 2 つの項目しかないことがあります。これらの 2 つの項目はそれぞれ非常に長いためです (合計すると 380 文字の制限を下回る可能性があります)。

コードがかなり悪いので、ジェネレーターを使用する必要があることはわかっています。これを行う方法がわかりません。

ありがとう。

4

2 に答える 2

3

このようなものが動作するはずです

def _splicegen(maxchars, stringlist):
    """
    Return a list of slices to print based on maxchars string-length boundary.
    """
    runningcount = 0  # start at 0
    tmpslice = []  # tmp list where we append slice numbers.
    for i, item in enumerate(stringlist):
        runningcount += len(item)
        if runningcount <= int(maxchars):
            tmpslice.append(i)
        else:
            yield tmpslice
            tmpslice = [i]
            runningcount = len(item)
    yield(tmpslice)

textwrapモジュールも参照してください

于 2013-02-04T03:36:20.740 に答える
1

これは単なるワンライナーです。役に立つことを願っています

>>>list=[[1,2], [1]]
>>>sorted(list, key=lambda sublist: len(sublist))
[[1], [1,2]]

また:

>>>list=[[1,2,3],[1],[1,2]]
>>>sorted(list, key=lambda sublist: -len(sublist))
[[1,2,3], [1,2], [1]]
于 2013-02-04T03:16:21.427 に答える