2014-04-13 7 views
5

mam tej wielowymiarowej tablicy:Jak odjąć tablicę wielowymiarową w Pythonie?

n = [[1], [2], [3], [4], [5], [6], [7, 10], [8], [9], [7, 10]] 

Chcę odjąć wszystkie z nich 1. Tak więc wynik będzie:

result = [[0], [1], [2], [3], [4], [5], [6, 9], [7], [8], [6, 9]] 
+2

Rozważ umieszczenie [NumPy] (http://www.numpy.org/). Robi matematyczną matematycznie znacznie lepiej niż przy użyciu list list. – user2357112

+0

@ user2357112 Numpy jest ogólnie dobra, ale tak naprawdę nie działa dla tego konkretnego przypadku - ponieważ zagnieżdżone listy mają różne długości, 'np.array (n)' daje tablicę z dtype = object zamiast int, a więc 'np.array (n) - 1' to TypeError (podczas gdy gdyby były tego samego rozmiaru, byłaby to dokładnie odpowiedź). – lvc

Odpowiedz

4

Jeśli masz listę list na pewno użyć zagnieżdżona lista zrozumieniem:

In [13]: result = [[e-1 for e in i] for i in n] 

In [14]: print result 
[[0], [1], [2], [3], [4], [5], [6, 9], [7], [8], [6, 9]] 
2
for x in n: 
    for i, y in enumerate(x): 
     x[i] = y - 1 

to jest bardziej wydajne, spacewise przynajmniej.

lub jeśli chcesz używać zagnieżdżonych listowych jak zhangxaochen było jednak przypisać go do tej samej wartości, tak robi to w miejscu:

n[:] = [[b - 1 for b in a] for a in n] 

Zauważ, że to faktycznie nadal tworzy dwa dodatkowe wykazy tak ma taka sama złożoność przestrzeni, jak przypisanie jej do nowej tablicy.

1
result=n 
for a in range(len(n)): 
    for b in range(len(n[a])): 
     result[a][b]=n[a][b]-1 
+0

'result = n' po prostu tworzy resztę tego samego, co przypisanie do' n'. Przypuszczalnie miałeś na myśli wynik powinien być głęboką kopią n, która musiałaby być "result = [m [:] dla m in n]". – lvc

1

Albo można użyć map():

>>> import operator 
>>> n = [[1], [2], [3], [4], [5], [6], [7, 10], [8], [9], [7, 10]] 
>>> map(lambda x: map(lambda y: operator.sub(y, 1), x), n) 
[[0], [1], [2], [3], [4], [5], [6, 9], [7], [8], [6, 9]] 
1
def difference(a, n): 
    try: 
     return a - n 
    except TypeError: 
     return [difference(i, n) for i in a] 

>>> difference([[1], [2], [3], [4], [5], [6], [7, 10], [8], [9], [7, 10]], 1) 
[[0], [1], [2], [3], [4], [5], [6, 9], [7], [8], [6, 9]] 
>>> difference([3, [1, 9, [1, 2, [3, 4, [5, 6]]]], [2], [[3, 4], [5, 6]], [3], [7, 10]], 1) 
[2, [0, 8, [0, 1, [2, 3, [4, 5]]]], [1], [[2, 3], [4, 5]], [2], [6, 9]] 

To działa dla wszystkich list wielowymiarowych.