działania arytmetyczne na dwóch listach

0

Witam,
Mam pytanie, czy da się w Pythonie jakimś sprytnym sposobem uzyskać coś takiego, że np dodając/mnożąc/odejmując/dzieląc dwie listy o niekoniecznie równej długości otrzymam dane działanie arytmetyczne na odpowiednich elementach listy plus na końcu dopisanie dłuższej listy np:

 
a = [1, 2, 3]
b = [1, 4, 7, 10, 1]
a + b = [1+1, 2+4, 3+7, 10, 1]

Mniej więcej wiem jak to zrobić używając sporo ifów pętli itp, w pythonie praktycznie nie pisałem jeszcze nic, a pewnie jest na to metoda jakas sprytna;)
W taki sposób działa(tylko dla dodawania, resztę pewnie trzeba w inny sposób zrobić), ale pewnie da się to zrobić fajniej:

a = [1,2,3, 4]
b = [1,2,10,12, 12, 17, 19]

summed = map(sum,zip(a,b))
if len(a) > len(b):
    for i in range(len(a)-(len(a)-len(b))-1, len(a)):
        summed.append(a[i])
else:
    for i in range(len(b)-(len(b)-len(a))-1, len(b)):
        summed.append(b[i])    
print summed
0
def suma(x,y):
	if not x: x=0
	elif not y: y=0
	return (x,y)

def suma_tablic(t1,t2):
	t3=[]
	for i,j in map(suma,t1,t2):
		t3.append(i+j)
	return t3

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

c = suma_tablic(a,b)

print c

Funkcja suma zmienia NoneType na zera, aby nie wyskoczył błąd. W funkcji suma_tablic mapujemy obie listy ze sobą używając funkcji suma i tworzymy trzecią listę z wynikami dodawań. Może nie jest to krótsze, ale bardziej czytelne. Z tego co szukałem, to w Pythonie nie ma jakichś specjalnych funkcji wbudowanych do tego.

0

http://docs.python.org/library/functions.html#map

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

c = map(None, a, b)
print c

da w rezultacie:
[(1, 1), (2, 4), (3, 7), (None, 10), (None, 1)]
Zostaje pozbyć się None, np. zastępując je zerami, żeby wykonać operacje na dwóch liczbach:

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

c = map(lambda x, y: int(x or 0) + int(y or 0), a, b)
print c

Operacja jest wykonywana nawet dla 5 / 0 :]

albo tak jak napisałeś "plus na końcu dopisanie dłuższej listy":

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

c = map(lambda x, y: (x + y) if (x and y) else (x or y), a, b)
print c

zamiast tej lambdy możesz dać sobie teraz jakąkolwiek funkcję...

2

A może tak?

import itertools;

map(sum,itertools.izip_longest(a,b,fillvalue=0))
0
Shalom napisał(a):

A może tak?

import itertools;

map(sum,itertools.izip_longest(a,b,fillvalue=0))

a jeśli chciałbym tym sposobem zrobić różnice i iloczyn z tym, że doszedłem do wniosku iż na potrzeby algorytmu iloczyn potrzebny mi jest na takiej zasadzie jak iloczyn dwóch nawiasów czyli każdy z każdym. Jest coś co zastąpi sum na opowiednie działania arytmetyczne?

0

Prawie nie ma problemu z działaniami symetrycznymi (dodawanie i mnożenie).

def mul(czynniki,start=1):
    for a in czynniki:
       start*=czynniki
    return start

Ale co z działaniami niesymetrycznymi?
[1,2] - [1,2,3] = [0,0,?]
[1,2,3] - [1,2] = [0,0,?]
Czego oczekujesz na trzecim miejscu? W obu przypadkach liczby 3?

1 użytkowników online, w tym zalogowanych: 0, gości: 1