Разница между элементами списка N размера n. Python

Скажем, у меня есть N списков размера n, например 5 кортежей размера 3:

p = [[9, 9, 9], [17, 14, 18], [14, 15, 17], [14, 15, 17], [14, 15, 15]]

Как найти разницу между индексами списков, например индекс 0:

17-9 = 8
14-17 = -3
14-14 = 0
14-14 = 0

затем для индекса 1:

14-9 = 5
15-14 = 1
15-15 = 0
15-15 = 0

затем индексируйте 2, 3, 4.

Мне нужен код, чтобы делать это динамически, чтобы я мог изменять N и n по своему желанию.

Любая помощь будет оценена.

РЕДАКТИРОВАТЬ:

Я пробовал это до сих пор:

for i in range(10):
    for j, k in product(range(i+1), repeat=2):
        if j!=k:continue
        else:
            print p[i][j]-p[i-1][j]

Этот код предназначен для кортежей размером 2.


person Sameer Patel    schedule 20.03.2013    source источник
comment
Это не кортежи. Кортежи заключены в скобки, например (9, 9, 9).   -  person ulidtko    schedule 20.03.2013
comment
Было бы полезно знать, что вы пробовали, а также что вы ищете в решении (например, самый питонический способ сделать это, самый быстрый, самый простой для чтения?)   -  person Emily    schedule 20.03.2013
comment
какой формат данных вы ожидаете? список тоже список?   -  person ornoone    schedule 20.03.2013


Ответы (5)


Попробуй это:

>>> for x in zip(*p):
    for i in range(len(x)-1):
        print '{0} - {1} = {2}'.format(x[i+1],x[i],x[i+1]-x[i])


17 - 9 = 8
14 - 17 = -3
14 - 14 = 0
14 - 14 = 0
14 - 9 = 5
15 - 14 = 1
15 - 15 = 0
15 - 15 = 0
18 - 9 = 9
17 - 18 = -1
17 - 17 = 0
15 - 17 = -2
person pradyunsg    schedule 20.03.2013

чертовски уродливый, не питонический, склонный ко всем ошибкам этого мира, но все же работающий (и, по крайней мере, должен показать вам базовую логику того, что вам нужно):

In [6]: for i in range(len(p[0])):
            for j in range(1,len(p)):
               print "%d - %d = %d" % (p[j][i], p[j-1][i], p[j][i]-p[j-1][i])
   ...:         
17 - 9 = 8
14 - 17 = -3
14 - 14 = 0
14 - 14 = 0
14 - 9 = 5
15 - 14 = 1
15 - 15 = 0
15 - 15 = 0
18 - 9 = 9
17 - 18 = -1
17 - 17 = 0
15 - 17 = -2

объяснение

  • строка 1: проверяет длину ваших подсписок на основе первого элемента вашего максимального списка.

  • строка 2: делает то же самое, начиная с первого индекса (так что вы можете сделать p [1] -p [0], не беспокоясь о проблемах с выходом за границы)

  • строка 3: печатает то, что вы хотите

Вы можете начать с этого, чтобы повозиться

person Samuele Mattiuzzo    schedule 20.03.2013

Это легко сделать с помощью numpy:

p = numpy.array([[9, 9, 9], [17, 14, 18], [14, 15, 17], [14, 15, 17], [14, 15, 15]])
numpy.diff(p.T)
person Charles Brunet    schedule 20.03.2013

Это должно сделать это:

for xyz in zip(*p):
   for curr_idx in xrange(len(xyz)-1):
     print xyz[curr_idx+1]-xyz[curr_idx]
person confused_at_times    schedule 20.03.2013

попробуй это

p = ((9, 9, 9), (17, 14, 18), (14, 15, 17), (14, 15, 17), (14, 15, 15))
index=0
for d in range(1,len(p)):
    print "p["+str(d)+"]["+str(index)+"]-p["+str(d)+"]["+str(index)+"]=",
    print p[d][index]-p[d-1][index]

выход

p[1][0]-p[1][0]= 8
p[2][0]-p[2][0]= -3
p[3][0]-p[3][0]= 0
p[4][0]-p[4][0]= 0
person Mahdi-bagvand    schedule 20.03.2013