-1

リストのリストを受け取り、同じサイズのリストのリストのリストを返す関数を書きたいと思います。たとえば、[[1,2], [0,1], [1,2,3], [0,1,2], [1,2,3,4]]入力として、関数は を返す必要があり[[[1,2],[0,1]], [[1,2,3],[0,1,2]], [[1,2,3,4]]]ます。最長のリストの長さを知っています。

私の最初の直感は、これにリスト内包表記を使用することでした。

def nestedlenlist(biglist,maxlen):
    return [[lists for lists in biglist if len(lists) == n] for n in xrange(0,maxlen)]

これには 2 つの不満があります。

  1. リストを何度も繰り返しmaxlenますが、長いリストでは時間がかかる場合があります。
  2. リストの最大長がわからない場合はどうすればよいですか?

解決策には次のようなものがありsortedます。最初にリストを並べ替えて、リストを一度だけ調べて、いつでもサイズが異なるようbiglist[i]に分割します。biglist[i+1]しかし、その後、ループしてインデックスをいじっていることに気付きます。これは、通常、Python では避けたいことです。

では、これを行うための最速かつ最も Pythonic な方法は何ですか?

4

5 に答える 5

2
In [1]: x =[[1,2], [0,1], [1,2,3], [0,1,2], [1,2,3,4]]

In [2]: result = {}

In [3]: for xx in x: result.setdefault(len(xx),[]).append(xx)

In [4]: result.values()
Out[4]: [[[1, 2], [0, 1]], [[1, 2, 3], [0, 1, 2]], [[1, 2, 3, 4]]]
于 2013-10-20T11:47:34.017 に答える
1
lens = [len(x) for x in biglist]
longest = max(lens)

# Need to make sure that the list of lists is not shallow copies
newlist = []
for n in range(longest):
    newlist.append 

for alist in biglist:
   x = len(alist) - 1
   newlist[x].append(alist)
于 2013-10-20T11:54:18.477 に答える
1

使用collections.defaultdict:

>>> from collections import defaultdict
>>> dic = defaultdict(list)
>>> lis = [[1,2], [0,1], [1,2,3], [0,1,2], [1,2,3,4]]
>>> for item in lis:
...     dic[len(item)].append(item)
...     
>>> dic.values()  # use `sorted` if you want result to be sorted by `len`
[[[1, 2], [0, 1]], [[1, 2, 3], [0, 1, 2]], [[1, 2, 3, 4]]]

または使用itertools.groupby

>>> from itertools import groupby
>>> lis = [[1,2], [0,1], [1,2,3], [0,1,2], [1,2,3,4]]
>>> sorted_lis = sorted(lis, key=len)  #sort the list based on length of items
>>> [list(g) for k, g in groupby(sorted_lis, key=len)]  
[[[1, 2], [0, 1]], [[1, 2, 3], [0, 1, 2]], [[1, 2, 3, 4]]]
于 2013-10-20T11:39:06.377 に答える
1

必要なロジックは、最初にリストを反復し、サブリストの各レンをグループにまとめてから、単にリストにまとめることです。これもそれらをソートします。しかし、もっと速くしたい場合は、ソートせずに実行できます。

from collections import defaultdict

def bucket_list(nested_list, sort=True):
    bucket = defaultdict(list)
    for sublist in nested_list:
        bucket[len(sublist)].append(sublist)
    return [v for k,v in sorted(bucket.items())] if sort else bucket.values()

それを使用して:

>>> bucket_list([[1,2], [0,1], [1,2,3], [0,1,2], [1,2,3,4]])
[[[1, 2], [0, 1]], [[1, 2, 3], [0, 1, 2]], [[1, 2, 3, 4]]]
于 2013-10-20T11:39:24.437 に答える
1

これは純粋なリスト内包表記ですが、最善ではありません (私はそう思います):

origin = [[1, 2], [0, 1], [1, 2, 3], [0, 1, 2], [1, 2, 3, 4], [1]]


def list_of_lists(some_list):
    """
    This is a weird algorithm
    @type some_list: list
    @rtype : list
    @param some_list:
    """
    if len(some_list) % 2:
        return [[a, b] for a, b in zip(some_list[::2], (some_list[1::2]))] + [some_list[len(origin) - 1]]
    else:
        return [[a, b] for a, b in zip(some_list[::2], (some_list[1::2]))]

if __name__ == '__main__':
    print list_of_lists(origin)        
于 2013-10-20T11:51:01.220 に答える