Объединить списки
Есть две библиотеки
ОСНОВНОЙ: ['Списки ', '\nПервый список', '\n 4. Пусто', '\n 5. Апельсин', '\n 6. Лимон', '\n 7. 2 мандарина']
ДЛЯ ЗАМЕНЫ: ['Второй список', '\n3. Яблоко ', '\n4. Банан ', '\n5. Груша']
Необходимо заменить элементы первого списка элементами из второго
В первом списке номера всегда идут по порядку, во втором такого может не быть. Если во втором списке есть номер, которого нет в основном, то он должен вставиться сверху или снизу соответственно.
То есть в результате должно получиться:
Списки
Первый список
Второй список
3. Яблоко #добавился
4. Банан #заменился
5. Груша #заменился
6. Лимон
7. 2 мандарина
Ответы (2 шт):
Не самый эффективный, не самый быстрый, не самый оптимизированный по памяти, но рабочий код:
a = ['Списки', 'Первый список', '4. Пусто', '5. Апельсин', '6. Лимон', '7. 2 мандарина']
b = ['Второй список', '3. Яблоко ', '4. Банан ', '5. Груша']
w = []
for i in range(len(a)): # находим все ненумерованные элементы первого списка, добавляем их в итоговый по порядку
if a[i][0] not in ['1', '2', '3', '4', '5', '6', '7', '8', '9']:
w.append('0. ' + a[i])
else:
n = i
break
for i in range(len(b)): # находим все ненумерованные элементы второго списка, тоже добавляем их в итоговый по порядку
if b[i][0] not in ['1', '2', '3', '4', '5', '6', '7', '8', '9']:
w.append('0. ' + b[i])
else:
m = i
break
w += a[n:] # добавляем нумерованные элементы первого списка
for i in range(m, len(b)): # проводим проверку нумерованных элементов второго списка, делаем необходимое действие(заменяем/добавляем)
for j in range(len(w)):
if b[i][:b[i].index('.')] == w[j][:w[j].index('.')]:
w[j] = b[i]
break
elif int(b[i][:b[i].index('.')]) < int(w[j][:w[j].index('.')]):
w = w[:j] + [b[i]] + w[j:]
break
k = 0 # красивый вывод
while w[k][0] == '0':
w[k] = w[k][3:]
k += 1
print('\n'.join(w))
Можно в принципе в три строки сделать. Объединяем два списка с заменой с небольшой заменой-преобразованием строки (убираем \n и т.п.).
Фильтруем два раза на список с текстом и числами через filter() c lambda-функцией, где проверяем через isdigit(), что у нас число в начале строки.
Дальше список с цифровой частью через split() делим, конвертируя результат в словарь. Так остаются только уникальные значения.
Список с текстовой частью объединяем со списком, сделанным из словаря.
list_1 = ['Списки ', '\nПервый список', '\n 4. Пусто', '\n 5. Апельсин', '\n 6. Лимон', '\n 7. 2 мандарина']
list_2 = ['Второй список', '\n3. Яблоко ', '\n4. Банан ', '\n5. Груша']
list_combo = [item.replace('\n ', '\n').strip() for item in list_1 + list_2]
list_text = list(filter(lambda x: not x[0].isdigit(), list_combo))
list_nums = dict(r.split('. ') for r in filter(lambda x: x[0].isdigit(), list_combo))
comb = list_text + sorted(['. '.join([k, v]) for k, v in list_nums.items()])
print(*comb, sep='\n')