13

与えられた(任意の)単語のリストlstを10個の等しい部分に分割する必要があります。

x = len(lst)/10

これらのパーツに変数名を付ける方法は?

出力には、単語数を含む10個の変数(part1, part2... part10)が必要です。x

4

9 に答える 9

34

リストとチャンクサイズを指定して、リストのリストを返すワンライナー:

>>> lol = lambda lst, sz: [lst[i:i+sz] for i in range(0, len(lst), sz)]

テスト:

>>> x = range(20, 36)
>>> print x
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]

>>> lol(x, 4)
[[20, 21, 22, 23], 
 [24, 25, 26, 27], 
 [28, 29, 30, 31], 
 [32, 33, 34, 35]]

>>> lol(x, 7)
[[20, 21, 22, 23, 24, 25, 26], 
 [27, 28, 29, 30, 31, 32, 33], 
 [34, 35]]

アップデート:

質問は本当に質問だと思います。リストと数値を指定すると、元のリストのアイテムが均等に分散された$(数値)リストを含むリストを返す関数です。したがって、lol(x、7)の例は、実際には[[20,21,22]、[23,24,25]、[26,27]、[28,29]、[30,31]、[32 、33]、[34,35]]。–マークリアン

さて、この場合、あなたは試すことができます:

def slice_list(input, size):
    input_size = len(input)
    slice_size = input_size / size
    remain = input_size % size
    result = []
    iterator = iter(input)
    for i in range(size):
        result.append([])
        for j in range(slice_size):
            result[i].append(iterator.next())
        if remain:
            result[i].append(iterator.next())
            remain -= 1
    return result

これは改善できると確信していますが、私は怠惰に感じています。:-)

>>> slice_list(x, 7)
[[20, 21, 22], [23, 24, 25], 
 [26, 27], [28, 29], 
 [30, 31], [32, 33], 
 [34, 35]]
于 2010-11-07T18:51:48.800 に答える
3

Pauloの更新(リストをサイズが1だけ異なるn個のチャンクに分割する)と同じ結果を達成するために、以下は再帰を使用する洗練されたソリューションです。

def divide(lst, n):
    p = len(lst) // n
    if len(lst)-p > 0:
        return [lst[:p]] + divide(lst[p:], n-1)
    else:
        return [lst]

例:

lst = list(range(13))
print divide(lst,5) # [[0, 1], [2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
于 2018-03-09T04:04:15.657 に答える
2

リストの等しいチャンクを生成する方法については、この質問を参照してください。次に、それらを別々の変数で本当に必要とする場合は、次のことができます。

part1, part2, ..., part10 = (part for part in chunks(lst, len(lst)/10))

ただし、コードを10個にハードコーディングするのではなく、より一般的なものにすることをお勧めします。

于 2010-11-07T18:43:09.770 に答える
1

テクニックを学ぶためにこのコードを書きますが、これを行うべきではありません。のようなコンテナデータ型のポイントはlistset要素ごとに変数を作成しなくても、任意のコンテンツを持つことができるということです。それで、

これをしないでください

>>> def chunks(l, n):
...     for i in xrange(0, len(l), n):
...         yield l[i:i+n]
...
>>> for i, chunk in enumerate(chunks(range(100), 10)):
...     locals()["part{0}".format(i)] = chunk
...
>>> part0
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> part1
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> part2
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29]

chunksレシピは、リンクされた質問のNed Batchelderの回答からのものです。これを行うべきではない理由は、変更locals(または実際にglobalsまたはvars)は適切な方法ではないためです。これにより、動作を特定するのが難しくなり、非常に厄介なバグが発生する可能性があります。

于 2010-11-07T18:51:04.823 に答える
1

連続する出力要素を強制する必要がない場合は、次の簡単なスニペットで十分です。

def even_divide(lst, num_piece=4):
    return [
        [lst[i] for i in range(len(lst)) if (i % num_piece) == r]
        for r in range(num_piece)
    ]

基本的に、コードはモジュロ残基に基づいて要素をグループ化します。そのため、出力リストの要素は連続していません。たとえば、入力がの場合range(21)

[[0, 1, 2, 3, 4, 5],[6, 7, 8, 9, 10],[11, 12, 13, 14, 15],[16, 17, 18, 19, 20]]

あなたが得るだろう

[[0, 4, 8, 12, 16, 20],[1, 5, 9, 13, 17],[2, 6, 10, 14, 18],[3, 7, 11, 15, 19]]

それが役に立てば幸い。

于 2016-08-11T23:00:33.280 に答える
0

タプルを使用する/結果を一覧表示する-最も合理的なアプローチ

新しい変数を定義する必要がある場合は、次のことができます。

  1. を使用setattrして、任意のに新しい属性を追加しますobject。既存の変数を上書きしないので安全です:
    res = object()
    ..。
    setattr(res、 "part" + index、part_generated)
    
  2. コードが実行されているコンテキストに応じて、生成された変数locals()または辞書を追加します。globals()
于 2010-11-07T18:56:14.873 に答える
0

いくつかの解決策を見ましたが、私の投稿を助けることができませんでした:

# List
lst = range(103)

# number of slices
nSlices = 10

# splitted list
slices = [len(lst) // (nSlices)] * nSlices

# but points are still missing!
remainder = len(lst)-sum(slices)

# split missing points across slices
slices[:remainder] = [ii + 1 for ii in slices[:remainder]]

splittedList = [lst[sum(slices[:ii]):sum(slices[:ii+1])] for ii in                range(nSlices)]
print lst
print '\n'.join("{}".format(n) for n in splittedList)

もちろん、さらに要約することもできますが、このように読むのは明らかだと思います。

于 2016-06-18T21:21:32.420 に答える
0

データフレームの@hennerayと同じ

def divide_df(df, n):    
    p = len(df.index) // n # size of one part is length / parts
    if len(df.index) - p > 0: # if a part of size p is still remaining
        return [df.iloc[0:p]] + divide(df.iloc[p:], n-1) # one part is from start to p, recursivly divide rest into n-1 pieces
    else:
        return [df]
于 2021-03-23T14:08:43.007 に答える
0

別の選択肢

chunk_size=5
_chunks=list(x [i:i+chunk_size]
                   for i in range(0, len(x ), chunk_size))
于 2021-08-28T17:03:52.667 に答える