1

我正在尝试将 3 个不同的列表合并到 1 个列表中。我可以用 2 个列表来做到这一点,但是当我添加第三个列表时,我开始收到错误消息

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

每个不同的列表应该交替。如果列表中没有更多项目要包含在“结果”中,它应该只替换其他 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

最好的方法是使用文档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 回答
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过滤掉一个“空”对象,保证不会出现在原始列表中(因为我们刚刚创建了它!)。

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
    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 回答