1

リストのリストがあり、リスト内の各リストを 2 つのリストに分割して、各リストの長さが最大 ​​30 になるようにします。それ以外の場合は、30 に収まらない残りを破棄して、 t は約 30 に近い。

例: リスト 1 の長さは 64 です -> それを 30 と 30 の 2 つのリストに分割し、残りの 4 を破棄します。

またはリスト 2 の長さが 41 の場合、30 の新しいリストを生成し、11 を破棄します。

またはリスト 3 の長さが 58 の場合、30 と 28 の 2 つのリストを生成します。

私が見つけたリスト分割機能を使用しています: https://stackoverflow.com/a/1751478/2027556

今私のコードは次のようなものです:

new_list = []
for list_ in cluster:
    if len(list_) < 31 and len(list_) > 24:
       new_list.append(list_)
    elif len(list_) >= 31:
       chunks_list = chunks(list_, 30)
       for item in chunks_list:
          if len(item) > 25:
             new_list.append(item)

ご覧のとおり、私は新しいリストを作成して古いリストを調べていますが、おそらくリスト内包表記を使用して、よりエレガントなpythonicソリューションがあると思いますか?

4

8 に答える 8

2

これについてあまり賢くする必要はありません。次のstep引数を使用できrange()ます。

cluster = list(range(100))
chunk_size = 30
result = [cluster[start:start+chunk_size] 
          for start in range(0, len(cluster), chunk_size)]
# discard last chunk if too small - adjust the test as needed
if len(result[-1]) < chunk_size:
    del result[-1]

の値はresultリストのリストになります:

[ [0, 1, ..., 29],
  [30, 31, ..., 59],
  [60, 61, ..., 89] ]

(つまり、入力と出力があまりにも明確に説明されていないということです-つまり、具体的な例が与えられていません。)

于 2013-04-09T22:51:13.837 に答える
0

ちょうど 2 つのリストの場合は、2 つのスライスを書くだけです

new_list = [cluster[:30], cluster[30:60]]
于 2013-04-09T23:03:23.560 に答える
0

本当にリスト内包表記が必要な場合..

new_list = [cluster[i:i+30] for i in xrange(0, len(cluster), 30) if len(cluster[i:i+30]) > 25]
于 2013-04-09T22:55:36.013 に答える
0

次のようなものが機能するはずです。

tmp = ((x[i:i+30] for i in range(0, len(x), 30)) for x in cluster)
new_list = [x for lst in tmp for x in lst if len(x) > 25]
于 2013-04-09T22:51:24.253 に答える
0

とともにジェネレーター関数を使用できますitertools.islice

In [11]: from itertools import islice

In [12]: lis=[range(64),range(41),range(58)]

In [13]: def solve(lis):
    for x in lis:
        it=iter(x)
        q,r=divmod(len(x),30)
        if r>25:
            for _ in xrange(q+1):
               yield list(islice(it,30)) 
        else:        
            for _ in xrange(q):
                yield list(islice(it,30))
   ....:                 

In [14]: map(len,list(solve(lis))) #use just `list(solve(lis))` to get the desired answer
Out[14]: [30, 30, 30, 30, 28] # (30,30) from 64, (30) from 41, and (30,28) from 58
于 2013-04-09T22:57:29.787 に答える
0

python itertools から変更するとgrouper、次のようなことができます。

def grouper(n, iterable, max_chunks):
    args = [iter(iterable)] * n
    chunks = []

    for zipped in zip_longest(fillvalue=None, *args):
        chunks.append([x for x in zipped if x is not None])
        if(len(chunks) == max_chunks):
            break

    return chunks

new_lists = [grouper(10,li,2) for li in list_list]

これにより、分割リストであるチャンクのリストが返されます。
これをもう少しフラットにしたい場合は、次のように呼び出すことができます。

new_lists = []
for li in list_list:
    new_lists.extend(grouper(10,li,2))
于 2013-04-09T23:16:36.853 に答える
0

new_list = [[lst[i*30:(i+1)*30] for i in xrange(len(lst)/30)] for lst in cluster]

于 2013-04-09T22:52:00.110 に答える