2009-02-10 56 views
53

現在我有vector3值表示爲列表。有沒有辦法減去2這些像vector3值,如在Python中減去2個列表

[2,2,2] - [1,1,1] = [1,1,1] 

我應該使用元組?

如果它們中沒有一個在這些類型上定義這些操作數,我可以定義它嗎?

如果不是,我應該創建一個新的vector3類嗎?

回答

96

如果這是你最終經常做的事情,並用不同的操作,您可能需要創建一個類來處理像這樣的情況下,或更好地使用一些庫,如Numpy

否則,尋找與zip內建函數使用list comprehensions

[a_i - b_i for a_i, b_i in zip(a, b)] 
+43

`[i - j for i,j in zip(a,b)]`更具可讀性,並且不會用a和b中的項代替a和b。 – 2012-06-07 07:59:26

4

如果你有兩個列表稱爲「A」和「B」,你可以這樣做:[m - n for m,n in zip(a,b)]

8

時退房NumPy包蟒蛇。

+1

爲什麼不說`使用numpy數組`以免人們探索整個numpy包? – 2017-02-21 05:13:25

3

如果您計劃執行的不僅僅是一個簡單的內襯,最好是實施您自己的班級,並在適用於您的案例時重寫相應的操作員。

Mathematics in Python摘自:

class Vector: 

    def __init__(self, data): 
    self.data = data 

    def __repr__(self): 
    return repr(self.data) 

    def __add__(self, other): 
    data = [] 
    for j in range(len(self.data)): 
     data.append(self.data[j] + other.data[j]) 
    return Vector(data) 

x = Vector([1, 2, 3])  
print x + x 
9

如果你的列表是a和b,你可以這樣做:

map(int.__sub__, a, b) 

但你可能不應該。沒有人會知道這意味着什麼。

+0

這是很酷的答案。 – garej 2017-04-09 05:31:40

66

下面是列表推導的替代方案。 Map迭代遍歷列表(後面的參數),同時進行,並將它們的元素作爲參數傳遞給函數(第一個arg)。它返回結果列表。

map(operator.sub, a, b) 

此代碼,因爲有較少的語法(這對我來說更美觀),顯然它是長度爲5的名單(見bobince的評論)提高了40%。不管怎樣,這兩種解決方案都可行

+0

我通常會看到在map()上重新列出的列表解析,儘管這可能只是因爲它看起來更清晰的代碼......不確定性能差異(如果有的話)。 – 2009-02-11 00:50:32

+2

在Py2.6中,對於五元素減法,映射()的出現速度快了近40%。理解更新,更清晰,避免使用lambda,但爲了映射現有函數,map仍然可以......特別是在這裏您可以利用內置zip。 – bobince 2009-02-11 01:07:33

+1

這是一個不錯的答案,我真的很感激它! – user69453 2015-05-29 12:11:30

4

稍微不同的Vector類。

class Vector(object): 
    def __init__(self, *data): 
     self.data = data 
    def __repr__(self): 
     return repr(self.data) 
    def __add__(self, other): 
     return tuple((a+b for a,b in zip(self.data, other.data))) 
    def __sub__(self, other): 
     return tuple((a-b for a,b in zip(self.data, other.data))) 

Vector(1, 2, 3) - Vector(1, 1, 1) 
10

我不得不建議NumPy以及

它不僅是做矢量數學更快,但它也有一噸的便利功能。

如果你想要的東西,甚至更快的一維向量,嘗試vop

它類似於MATLAB,但自由的東西。這裏是你要做什麼的一個例子

from numpy import matrix 
a = matrix((2,2,2)) 
b = matrix((1,1,1)) 
ret = a - b 
print ret 
>> [[1 1 1]] 

Boom。如果你想要的結果列表

list(array([1,2,3])-1) 
-1

試試這個。

0

list(numpy.array(list1)-numpy.array(list2)) 

如果不刪除列表

1
import numpy as np 
a = [2,2,2] 
b = [1,1,1] 
np.subtract(a,b) 
0

對於曾經在Pycharm上編碼的人,它也會復活其他人。

import operator 
Arr1=[1,2,3,45] 
Arr2=[3,4,56,78] 
print(list(map(operator.sub,Arr1,Arr2)))