如何在一个列表中相乘,同时在另一个列表中提供范围

时间:2019-06-19 07:23:47

标签: python list

我有两个列表,稍后将使用它们确定我正在查看文档的多少页。第一个列表(l_name)包含文档的名称。第二个列表(l_depth)包含我将要查看的页面数,始终从第一个列表开始。

原始列表如下:

l_name = ['Doc_1', 'Doc_2', 'Doc_3']
l_depth = [1, 3, 2]

由于我想使用for循环来表示我将要查看的每一页

for d,p in zip(l_doc, l_page):
  open doc(d) on page(p)
  do stuff

我需要新列表如下所示:

l_doc = ['Doc_1', 'Doc_2', 'Doc_2', 'Doc_2', 'Doc_3', 'Doc_3']
l_page = [1, 1, 2, 3, 1, 2]

如何根据所需的深度乘以名称(l_name-> l_doc),并根据深度提供范围(l_depth-> l_page)?

9 个答案:

答案 0 :(得分:4)

您可以通过理解获得列表:

// $("#frm_init").submit(function(event){
// $(document).on("submit","frm_init", function(event) {                                                                
// $(document).on("click","#init_submit", function(event) { 
// $("#init_submit").click(function(event){

答案 1 :(得分:3)

具有内置的zipitertools.chain.from_iterable函数:

from itertools import chain

l_name = ['Doc_1', 'Doc_2', 'Doc_3']
l_depth = [1, 3, 2]

result = list(chain.from_iterable([n]*d for n, d in zip(l_name, l_depth)))
print(result)

输出:

['Doc_1', 'Doc_2', 'Doc_2', 'Doc_2', 'Doc_3', 'Doc_3']

答案 2 :(得分:2)

尝试一下:

ConfigurationSupport

答案 3 :(得分:2)

对于页面列表,您可以执行与zippa建议的相同的操作:

[k+1 for i, j in zip(l_name, l_depth) for k in range(j)]

输出:

[1, 1, 2, 3, 1, 2]

答案 4 :(得分:1)

我们已经有了所有不错的答案,但是嘿,我已经在做了,所以在这里:

l_name = ['Doc_1', 'Doc_2', 'Doc_3']
l_depth = [1, 3, 2]
l_result = []
index = 0

for depth in l_depth:
  for times in range(depth):
    l_result.append(l_name[index])
  index +=1

print(l_result)

答案 5 :(得分:1)

灵感来自@zipa答案:

l_doc_page =  [(k,p+1) for i, j in zip(l_name, l_depth) for p,k in enumerate([i]*j)]

那会给你:

[('Doc_1', 1), ('Doc_2', 1), ('Doc_2', 2), ('Doc_2', 3), ('Doc_3', 1), ('Doc_3', 2)]

如果您打算在迭代时将列表压缩在一起,则可以直接使用l_doc_page

for doc, page in l_doc_page: do_sth(doc, page)

或者您可以解压缩列表并解压缩:

l_doc, l_page = zip(*l_doc_page)

然后您将得到问题所要求的结果:

>>> l_doc, l_page=zip(*((k,p+1) for i, j in zip(l_name, l_depth) for p,k in enumerate([i]*j)))
>>> l_doc
('Doc_1', 'Doc_2', 'Doc_2', 'Doc_2', 'Doc_3', 'Doc_3')
>>> l_page
(1, 1, 2, 3, 1, 2)

答案 6 :(得分:1)

这是一个使用itertools的基于repeat的人:

from itertools import repeat

l_name = ['Doc_1', 'Doc_2', 'Doc_3']
l_depth = iter([1, 3, 2])

[i for i in l_name for j in repeat(i, next(l_depth))]
# ['Doc_1', 'Doc_2', 'Doc_2', 'Doc_2', 'Doc_3', 'Doc_3']

答案 7 :(得分:0)

l_name = ['Doc_1', 'Doc_2', 'Doc_3']
l_depth = [1, 3, 2]

l_doc = []
l_page = []

for i, j in zip(l_name, l_depth):
    l_doc += [i] * j
    l_page += range(1, j + 1)

print(l_doc)
print(l_page)

答案 8 :(得分:0)

尝试一下:


ret = sum([[ (name, i) for i in  range(1, depth + 1)] for name, depth in zip(l_name, l_depth)], [])
l_doc, l_page = zip(*ret)