1

3つの異なるリストを1つのリストに結合しようとしています。2つのリストでそれを行うことができましたが、3つ目を追加すると、次のようなエラーが発生し始めました。

ValueError: attempt to assign sequence of size 22 to extended slice of size 17.  

異なるリストのそれぞれが交互になるはずです。'result'に含めるアイテムがリストにない場合は、他の2つのリストに置き換える必要があります。これを有効にする方法について何かアドバイスはありますか?

    print len(reddit_feed_dic)      #22
    print len(favorites_feed_dic)   #22
    print len(user_videos)          #6

    result = [None]*(len(favorites_feed_dic)+len(reddit_feed_dic)+len(user_videos))
    print len(result)
    result[::3] = reddit_feed_dic
    result[1::3] = favorites_feed_dic
    result[2::3] = user_videos

サンプルデータの例を次に示します。

reddit_feed_dic = [r1,r2,r3, ...r22]
favorite_feed_dic = [f1,f1,f3, ...f22]
user_videos = [u1, u2 u3, ...u6]

結果を次のようにしたいと思います。

result = [r1,f1,u1, 
            r2, f2, u2,
            r3, f3, u3,
            r4, f4, u4,
            r5, f5, u5,
            r6, f6, u6,
            r7,f7,
            r8,f8,
            r9,f9,...

            r22,f22]
4

3 に答える 3

0
    python 3.2

    from itertools import zip_longest

    result = [j for i in zip_longest(list1,list2,list3) for j in i if j!=None] 
于 2012-12-24T16:13:40.670 に答える
0
>>> from itertools import *

空のスペースを次のように埋めたい場合None

>>> list(chain(*izip_longest('abcdef', '12345', '#!$')))
['a', '1', '#', 'b', '2', '!', 'c', '3', '$', 'd', '4', None, 'e', '5', None, 'f', None, None]

空のアイテムがまったく必要ない場合で、開始リストにまだ空のアイテムが含まれていないと仮定すると、次のようNoneになります。

>>> filter(lambda x: x is not None, chain(*izip_longest('abcdef', '12345', '#!$')))
['a', '1', '#', 'b', '2', '!', 'c', '3', '$', 'd', '4', 'e', '5', 'f']

リストに含まれいる場合Noneは、少し注意が必要です。同じ考えですが、フィルターで除外する代わりにNone、元のリストに存在しないことが保証されている「null」オブジェクトをフィルターで除外します(作成したばかりなので)。

def interleave(*iterables):
    null = object()
    return ifilter(lambda x: x is not null, chain(*izip_longest(*iterables, fillvalue=null)))
于 2012-12-23T22:58:30.970 に答える
0

これを行う最良の方法は、ドキュメントroundrobinで提供されているレシピを使用することです。itertools

>>> from itertools import cycle, islice
>>> def roundrobin(*iterables):
        "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
        # Recipe credited to George Sakkis
        pending = len(iterables)
        nexts = cycle(iter(it).next for it in iterables)
        while pending:
            try:
                for next in nexts:
                   yield next()
            except StopIteration:
                pending -= 1
                nexts = cycle(islice(nexts, pending))


>>> reddit_feed = ['r1','r2','r3']
>>> favorite_feed = ['f1','f2','f3']
>>> user_videos = ['u1','u2','u3']
>>> list(roundrobin(reddit_feed, favorite_feed, user_videos))
['r1', 'f1', 'u1', 'r2', 'f2', 'u2', 'r3', 'f3', 'u3']
于 2012-12-24T04:20:54.907 に答える