Как мне расширить один список до длины другого?

#python #list #append #extend

#python #Список #добавить #расширить

Вопрос:

Вот мой код:

 difference = len(L4)-len(L3)
if difference == 0:
    pass
elif difference > 0:
    x = L3[0:difference]
    L3.extend(x)
elif difference < 0:
    x = L4[0:difference]
    L4.extend(x)
  

L4 и L3 — это два отдельных списка, и я хочу, чтобы они были одинаковой длины. Я хочу, чтобы список L3 был расширен до размера L4, если он меньше, и наоборот.

Пример одного ввода:

 0;NATE;NATHAN      #NATE is L3, NATHAN IS L4
  

Пример одного вывода:

 [78, 65, 84, 69, 78, 65]     #L3
[78, 65, 84, 72, 65, 78]     #L4
  

* Здесь список L3 расширяется до длины списка L4.

Пример Второго ввода:

 0;NAT;DNADNANNFNDFGDFGFGF
  

Пример Второго вывода:

 [78, 65, 84, 78, 65, 84]
[68, 78, 65, 68, 78, 65, 78, 78, 70, 78, 68, 70, 71, 68, 70, 71, 70, 71, 70]
  

После многократного тестирования моего кода оказалось, что L3, первая строка выводимого кода, будет повторяться дважды, прежде чем остановиться, поэтому, если L4 невероятно длинный, L3 не будет расширяться до такой же длины. Как мне решить эту проблему?

Ответ №1:

Вы можете использовать cycle и islice из библиотеки itertools.

 from itertools import cycle, islice

def process(shorter, aim):
  #shorter is a lit of int
  #aim is the targeted len
  return list(islice(cycle(shorter), aim))

L3 = [ord(i) for i in 'NATE' ]
L4 = [ord(i) for i in 'NATHAN']
difference = len(L4)-len(L3)
if difference == 0:
  pass
elif difference > 0:
  print(process(L3, len(L4)), L4)
elif difference < 0:
  print(L3, process(L4, len(L3)))
  

производит

 [78, 65, 84, 69, 78, 65] [78, 65, 84, 72, 65, 78]
  

Если вам нужно более примитивное решение без вызова функции. Возможно, вы захотите вычислить, сколько раз вам нужно повторить список, а также явно вычислить оставшуюся часть.

Ответ №2:

Если я не буду слишком сильно менять ваш код, вы могли бы попробовать что-то вроде:

Решение 1

 L3 = list('NAT')
L4 = list('DNADNANNFNDFGDFGFGF')

difference = len(L4)-len(L3)
if difference == 0:
    pass
elif difference > 0:
    num_times, remainder = divmod(len(L4), len(L3))
    x = L3 * num_times   L3[:remainder]
    L3 = x
elif difference < 0:
    num_times, remainder = divmod(len(L3), len(L4))
    x = L4 * num_times   L4[:remainder]
    L4 = x

L3 = list(map(ord, L3))
L4 = list(map(ord, L4))

print(L3, 'n', L4, sep='')
  

Но если мы хотим упростить, у нас могло бы быть что-то вроде этого:

Решение 2

 L3 = list('NAT')
L4 = list('DNADNANNFNDFGDFGFGF')

size_of_bigger = max(len(L3), len(L4))

num_times, remainder = divmod(size_of_bigger, len(L3))
L3 = L3 * num_times   L3[:remainder]

num_times, remainder = divmod(size_of_bigger, len(L4))
L4 = L4 * num_times   L4[:remainder]

output = "n".join(str(list(map(ord, x))) for x in [L3, L4])
print(output)
  

Если мы зайдем в рефакторинге немного слишком далеко:

Решение 3

 L3 = list('NAT')
L4 = list('DNADNANNFNDFGDFGFGF')

input_lists = [L3, L4]

size_of_bigger = max(map(len, input_lists))

def output_lists(input_lists):
    for current_list in input_lists:
        num_times, remainder = divmod(size_of_bigger, len(current_list))
        yield current_list * num_times   current_list[:remainder]

output = "n".join(str(list(map(ord, x))) for x in output_lists(input_lists))
print(output)