#python_3x #list
Здравствуйте, стоит следующая задача:
Есть 2 txt файла (количество строк в каждом произвольно). Необходимо строки из одного
списка вставить в другой через определённый интервал, например, через каждые n строк.
f1 = open(r'c:\Исходная база.txt')
f2 = open(r'c:\Строки для добавления.txt')
list1 = f1.readlines()
list2 = f2.readlines()
f1.close()
f2.close()
i = 0
n = 2
while i + n <= 10:
list1.insert(i * n, list2[i])
i = i + 1
with open(r'c:\результат.txt', 'w') as res:
for item in list1:
res.write("{}".format(item))
В случае, если задать
while i + n <= len(list2):
list2 - файл откуда берём строки для подстановки, код работает как надо.
Однако, при
while i + n <= len(list1):
Получаю ошибку:
list1.insert(i * n, list2[i])
IndexError: list index out of range
Прошу подсказать как реализовать подстановку строк из list2 в случае, если строк
в list2 меньше, чем в list1. То есть когда строки в list2 кончатся, подстановка строк
должна опять начаться с 0 элемента list2.
Исходные данные list1: 1, 2, 3, 4, .., m
Исходные данные List2: a, b, c, d, .., k
Результат должен быть: 1, a, 2, b, 3, c ... при n=2
1, 2, a, 3, 4, b, .. при n=3
При этом важно, чтобы строки подставлялись именно из list2 в list1. И когда строки
в list2 кончатся, они должны опять начать подставляться с 0 элемента.
Ответы
Ответ 1
Чтобы элементы по кругу возвращались (начинались с первого по окончанию), можно itertools.cycle() использовать. Чтобы по несколько элементов сразу обходить, можно zip(*[iterator]*n) идиому применить. Чтобы чередовать группы из первого итератора с элементами из второго и вернуть плоскую версию (без рекурсии) и обрезая ввод по меньшей длине аргументов: import itertools flatten = itertools.chain.from_iterable def interlaced(groups, items): return flatten(itertools.chain(group, [item]) for group, item in zip(groups, items)) Объединяя : n = 3 lines = interlaced(zip(*[itertools.cycle(f1)]*(n-1)), f2) output_file.writelines(lines) Пример: f1 = iter([1,2,3,4]) f2 = iter("abcde") it = interlaced(zip(*[itertools.cycle(f1)]*(n-1)), f2) print(*it) # -> 1 2 a 3 4 b 1 2 c 3 4 d 1 2 eОтвет 2
Воспользуйтесь модулем itertools: In [1]: l1 = [1,2,3,4] In [2]: l2 = list('abcde') In [3]: from itertools import zip_longest, chain, cycle In [4]: list(chain.from_iterable(zip(cycle(l1), l2))) Out[4]: [1, 'a', 2, 'b', 3, 'c', 4, 'd', 1, 'e']
Комментариев нет:
Отправить комментарий