Как я могу умножить элементы в одном списке, предоставляя диапазон в другом - PullRequest
4 голосов
/ 19 июня 2019

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

4 голосов
/ 19 июня 2019

Вы можете получить свой список с пониманием:

[k for i, j in zip(l_name, l_depth) for k in [i]*j]
3 голосов
/ 19 июня 2019

Со встроенными функциями 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']
2 голосов
/ 19 июня 2019

Для списка страниц вы можете сделать то же самое, что предложил zippa:

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

выход:

[1, 1, 2, 3, 1, 2]
2 голосов
/ 19 июня 2019

Попробуйте это:

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]
1 голос
/ 19 июня 2019

Вот 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']
1 голос
/ 19 июня 2019

Вдохновленный ответом @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)
1 голос
/ 19 июня 2019

У нас уже есть все хорошие ответы, но эй, я уже делал это, так что вот, пожалуйста:

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)
0 голосов
/ 19 июня 2019

Попробуйте это:


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)

0 голосов
/ 19 июня 2019
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...