如何以特定间隔将列表插入列表?

时间:2015-09-08 11:33:27

标签: python-3.x ipython

我有2个列表,我希望每隔7个时间将一个列表添加到另一个列表中。

在我的iPython' whos'中,我有:

Variable                      Type             Data/Info
full_links                    list             n=15
spannedcopynotags             list             n=105

所以,我想在' full_links'中添加一个索引项。在&spanquocopynotags'中的每第7个索引项之后。

' full_links'是15个http://链接和' spannedcopynotags'是所有链接的描述信息。因此,链接的其他顺序不符合描述。

3 个答案:

答案 0 :(得分:0)

您可以将list.insert()用于此目的,例如:

list1 = range(100)
list2 = range(10)

pos = 0
for item in list2:
    list1.insert(pos, item)
    pos += 7

请注意,如果位置超出列表的长度,list.insert()会将项目插入到列表的末尾。

答案 1 :(得分:0)

full_links的每个step(7)元素中添加一个full_links元素的另一种解决方案。

# data for testing
spannedcopynotags = range(105)
full_links = ['%c' % c for c in range(65, 65+15)]

# compute step
length = len(spannedcopynotags)
step = length/len(full_links)

# main part
result = []
for pos_links, pos_spanned in enumerate(range(0, length, step)):
    result+= spannedcopynotags[pos_spanned:pos_spanned+step] + [full_links[pos_links]]

# main part in an unreadable one-liner
result = [
    item
    for pos, link in zip(range(0, length, step), full_links)
    for item in (spannedcopynotags[pos:pos+step] + [link])
]

预期结果:

[0, 1, 2, 3, 4, 5, 6, 'A', 7, 8, 9, 10, 11, 12, 13, 'B', 14, ...]

答案 2 :(得分:0)

我同意for循环是最简单,最容易理解的方式。但是,使用zip有好处:

  • 它不会修改输入列表
  • 更容易正确处理列表长度的重要差异

以下是在这种情况下如何使用zip的示例:

x = list('abcdefghijklmnopqrstu')
y = list('123')
it_x = iter(x)
result = [
    item for items in zip(it_x, it_x, it_x, it_x, it_x, it_x, y) 
    for item in items
]

要了解其工作原理,请考虑:

zip(x, x, x, x, x, x, x, y)

相当于:

zip(iter(x), iter(x), iter(x), iter(x), iter(x), iter(x), iter(x), y)

通过自己创建迭代器,并使用相同的7次而不是独立的迭代器,你总是得到下一个项目,而不是相同的项目7次。

为了缩短它,你可以使用参数解包:

composition = 7*[iter(x)] + [y]
result = [item for items in zip(*composition] for item in items]

如果你不喜欢双列表理解:

from itertools import chain
result = list(chain.from_iterable(zip(*composition)))

严格来说,所有这些都依赖于zip的实现细节,它的参数中的项目按顺序被抓取,但是它起作用并且不太可能改变。文档读取这依赖的评估顺序是有保证的。