我有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'是所有链接的描述信息。因此,链接的其他顺序不符合描述。
答案 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
的实现细节,它的参数中的项目按顺序被抓取,但是它起作用并且不太可能改变。