У меня есть два списка, которые я буду использовать позже, чтобы определить, сколько страниц документа я просматриваю. Первый список (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) также на основе глубины?






Со встроенными функциями 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_doc, l_page = zip(*[(k,j) for i, j in zip(l_name, l_depth) for k in [i]*j])@olivecoder твой l_page был бы (1, 3, 3, 3, 2, 2)
о, да. Я видел это, но не уделил должного внимания вопросу, поэтому подумал, что это ожидаемый результат.
[(k,p+1) for i, j in zip(l_name, l_depth) for p,k in enumerate([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:
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)
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)
Попробуй это:
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) for i, j in zip(l_name, l_depth) for k in [i]*j]