3

Я бы хотел использовать элементы списка по элементам без использования numpy, например, я хочу add([1,2,3], [2,3,4]) = [3,5,7] и mult([1,1,1],[9,9,9]) = [9,9,9], но я не уверен, какой способ сделать он считается «правильным».правильный стиль для элементарных операций над списками без numpy (python)

Два решения я придумал были

def add(list1,list2): 
    list3 = [] 
    for x in xrange(0,len(list1)): 
     list3.append(list1[x]+list2[x]) 
    return list3 

def mult(list1, list2): 
    list3 = [] 
    for x in xrange(0,len(list1)): 
     list3.append(list1[x]*list2[x]) 
    return list3 

def div(list1, list2): 
    list3 = [] 
    for x in xrange(0,len(list1)): 
     list3.append(list1[x]/list2[x]) 
    return list3 

def sub(list1, list2): 
    list3 = [] 
    for x in xrange(0,len(list1)): 
     list3.append(list1[x]-list2[x]) 
    return list3 

где каждый оператор задается отдельной функции

и

def add(a,b) 
    return a+b 
def mult(a,b) 
    return a*b 
def div(a,b) 
    return a/b 
def sub(a,b) 
    return a-b 
def elementwiseoperation(list1, list2, function): 
    list3 = [] 
    for x in xrange(0,len(list1)): 
     list3.append(function(list1[x],list2[x])) 
    return list3 

, где определены все основные функции, и у меня есть отдельную функцию, чтобы использовать их для каждого элемента. Я просмотрел PEP8, но не нашел ничего актуального. Какой путь лучше?

+0

не может использовать 'map'? вместо 'elementwiseoperation'. См: http://docs.python.org/2/library/functions.html#map –

+0

, связанные с: http://stackoverflow.com/questions/18713321/element-wise-addition-of-2-lists-in- python –

ответ

5

Обычный способ сделать это было бы использовать map или itertools.imap:

import operator 
multiadd = lambda a,b: map(operator.add, a,b) 
print multiadd([1,2,3], [2,3,4]) #=> [3, 5, 7] 

Ideone: http://ideone.com/yRLHxW

map является с Реализуемый версию вашего elementwiseoperation, с преимуществом наличия стандартного имени, работающего с любым i и быстрее.

В качестве альтернативы, вы можете использовать partial и map для pointfree приятно стиля:

import operator 
import functools 

multiadd = functools.partial(map, operator.add) 
print multiadd([1,2,3], [2,3,4]) #=> [3, 5, 7] 

Ideone: http://ideone.com/BUhRCW

Во всяком случае, вы сделали первые шаги в функциональном программировании себя. Я предлагаю вам прочитать эту тему.

Как правило, итерация по индексу с использованием range обычно считается неправильной, если вы хотите посетить каждый элемент. Обычный способ сделать это - просто перебрать структуру напрямую. Используйте zip или itertools.izip итерировать параллельно:

for x in l: 
    print l 

for a,b in zip(l,k): 
    print a+b 

И обычный способ итерацию, чтобы создать список не использовать append, но список понимание:

[a+b for a,b in itertools.izip(l,k)] 
+0

Спасибо за ответы и отзыв об итерировании по списку (я всегда делал это с диапазоном по какой-то причине). – shimao

+0

@ user1858363 Добро пожаловать. Так вы можете сделать это на C или Java; в python это неэффективно и менее читаемо. Это подходит только в том случае, если вы хотите посетить некоторые подмножества элементов. Даже тогда я увижу, есть ли функция itertools, которая могла бы помочь. – Marcin

0

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

sum = [x+y for x,y in zip (list1, list2) ] 
diff = [x-y for x,y in zip (list1, list2) ] 
mult = [x*y for x,y in zip (list1, list2) ] 
div = [x/y for x,y in zip (list1, list2) ] 
+0

Карта будет более чистой и эффективной для этого типа операций. – Marcin

2

Это может быть сделано только с используя map и operator модуль:

>>> from operator import add,mul 
>>> map(add, [1,2,3], [2,3,4]) 
[3, 5, 7] 
>>> map(mul, [1,1,1],[9,9,9]) 
[9, 9, 9] 
+1

Какой смысл вмешиваться в «func» здесь? Это буквально просто псевдоним для «карты». – Marcin

+0

@Marcin Исправьте вы, было бы лучше, чтобы удалить 'func', потому что просто' map' прекрасно –

+0

Кроме того, я думаю, вам будет интересно, как 'functools.partial' может сделать это в одну функцию, не вставляя «ламба». – Marcin

0

Как насчет:

import operator 

a = [1, 2, 3] 
b = [2, 3, 4] 

sum = map(operator.add, a, b) 
mul = map(operator.mul, a, b) 

Нет, нет смысла писать собственные функции в этом случае.
Просто используйте map и operator, поскольку вы ничего не реализуете.
Любая обертка на map это просто еще один материал, чтобы положить на стек.
Любая собственная реализация происходит медленнее, чем встроено решение.

Смежные вопросы