Python: создание функции, которая сравнивает 2 массива и вставляет более крупные элементы между 2 массивами - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь создать функцию, которая сравнивает 2 массива и создает новый список с максимальным количеством элементов списка без использования numpy.Мне удалось создать ручную версию, но у меня возникли проблемы с ее реализацией в функцию.

Задача: Создать функцию максимум_аррэйсов (a, b), которая сравнивает массивы a и b поэлементно и возвращает новый массив.содержащий более крупные элементы.Используйте функцию insert2 для добавления новых элементов в список.

Пример: от применения функции к массивам a = [12,5,8,19,6] и b = [3,6,2,12,4] результат должен быть c = [12,6,8,19,6].

Текущий код:

list_a = [12,5,8,19,6]
list_b = [3,6,2,12,4]

maximum_arrays = []
for item in list_a:
    if list_b[item] > list_a[item]:
        maximum_arrays.insert(list_b[item])
    else:
        maximum_arrays.insert(list_a[item])

print(maximum_arrays)

Ручная версия:

list_a = [12,5,8,19,6]
list_b = [3,6,2,12,4]
#answer example
c = [12,6,8,19,6]

#empty list
maximum_arrays = []

#for each part of the list, choose the highest number of the other list and insert
maximum_arrays.insert(0, max(list_a[0],list_b[0]))
maximum_arrays.insert(1, max(list_a[1],list_b[1]))
maximum_arrays.insert(2, max(list_a[2],list_b[2]))
maximum_arrays.insert(3, max(list_a[3],list_b[3]))
maximum_arrays.insert(4, max(list_a[4],list_b[4]))

print(maximum_arrays)

Ответы [ 4 ]

1 голос
/ 20 сентября 2019

используйте max в понимании списка по сжатым спискам или numpy.max.

list_a = [12,5,8,19,6]
list_b = [3,6,2,12,4]

max_array = [max(i) for i in zip(list_a, list_b)]

print(max_array)

Объяснение здесь таково: zip превращает n итераций в итератор над кортежами, где каждый кортежимеет n предметов.Таким образом, в случае двух списков zip([1, 2, 3], [4, 5, 6]) превращается в ((1, 4), (2, 5), (3, 6)).Взяв max всех этих кортежей, вы получите свой список.

Важное предостережение, которое несколько раз сожгло меня, заключается в том, что число генерируемых кортежей равно длине самого короткого . повторяется в zip.Другими словами, zip не генерирует исключение при передаче итераций различной длины, а просто останавливается, когда заканчивается один из входных списков.В этом отношении он отличается от numpy.max, который выдает ошибку, если заданы списки различной длины.

0 голосов
/ 20 сентября 2019

Вы можете решить многие способы, такие же, как ваша функция или понимание списка, используя функцию zip.Ниже приведено решение: если обе длины одинаковы, возьмите одну длину списка, выполните итерацию и используйте опцию «добавить» / «вставить», чтобы добавить значение в список.

list_a = [12,5,8,19,6]
list_b = [3,6,2,12,4]

maximum_arrays = []
list_length = len(list_a)
for item in range(list_length):
if list_b[item] > list_a[item]:
    maximum_arrays.append(list_b[item])
else:
    maximum_arrays.append(list_a[item])

print(maximum_arrays)
0 голосов
/ 20 сентября 2019

Другой способ использования itertools.starmap:

list(starmap(max, zip(list_a, list_b)))

Вывод:

[12, 6, 8, 19, 6]

Это примерно в 1,4 раза быстрее, чем понимание списка:

%timeit list(starmap(max, zip(list_a, list_b)))
# 1.19 µs ± 49.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit [max(i) for i in zip(list_a, list_b)]
# 1.69 µs ± 213 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
0 голосов
/ 20 сентября 2019

Вы ищете что-то вроде этого:

list_a = [12,5,8,19,6]
list_b = [3,6,2,12,4]

l = []
for i,j in enumerate(zip(list_a, list_b)):
    l.insert(i, max(j))

print(l)
...