Python 如何在一个列表中增加元素,同时在另一个列表中提供范围

Python 如何在一个列表中增加元素,同时在另一个列表中提供范围,python,list,Python,List,我有两个列表,稍后我将使用它们来确定我正在查看的文档的页数。第一个列表(l_名称)包含文档的名称。第二个列表(l_depth)包含我将查看的页数,总是从第一个开始 原始列表如下所示: l_name = ['Doc_1', 'Doc_2', 'Doc_3'] l_depth = [1, 3, 2] l_doc = ['Doc_1', 'Doc_2', 'Doc_2', 'Doc_2', 'Doc_3', 'Doc_3'] l_page = [1, 1, 2, 3, 1, 2] 因为我想使用fo

我有两个列表,稍后我将使用它们来确定我正在查看的文档的页数。第一个列表(l_名称)包含文档的名称。第二个列表(l_depth)包含我将查看的页数,总是从第一个开始

原始列表如下所示:

l_name = ['Doc_1', 'Doc_2', 'Doc_3']
l_depth = [1, 3, 2]
l_doc = ['Doc_1', 'Doc_2', 'Doc_2', 'Doc_2', 'Doc_3', 'Doc_3']
l_page = [1, 1, 2, 3, 1, 2]
因为我想使用for循环来指示我将要查看的每个页面

for d,p in zip(l_doc, l_page):
  open doc(d) on page(p)
  do stuff
我需要新列表如下所示:

l_name = ['Doc_1', 'Doc_2', 'Doc_3']
l_depth = [1, 3, 2]
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)?

使用内置的
zip
itertools.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']

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

[k for i, j in zip(l_name, l_depth) for k in [i]*j]
试试这个:

l_name = ['Doc_1', 'Doc_2', 'Doc_3']
l_depth = [1, 3, 2]
l_doc = []
for i,j in zip(l_name, l_depth):
    l_doc += [i]*j
# ['Doc_1', 'Doc_2', 'Doc_2', 'Doc_2', 'Doc_3', 'Doc_3']

l_page = [k for _,j in zip(l_name, l_depth) for k in range(1,j+1)]
# [1, 1, 2, 3, 1, 2]

对于页面列表,您可以按照zippa建议的方法进行操作:

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

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

我们已经有了很好的答案,但嘿,我已经在做了,所以给你:

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)

灵感来自@zipa-answer:

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\u doc\u页面

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)
下面是一个基于以下内容的示例:

试试这个:


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)


[(k,j)表示i,j在zip中(l_名称,l_深度)表示k在[i]*j]中
l_文档,l_页面=zip(*[(k,j)表示i,j在zip中(l_名称,l_深度)表示k在[i]*j])
@olivecoder你的
l_页面将是
(1,3,3,2)
哦,是的。我看到了这一点,但我没有对这个问题给予足够的关注,因此我认为这是预期的结果
[(k,p+1)对于zip中的I,j(l_name,l_depth)对于枚举中的p,k([I]*j)]