Wejście:

['mia', 5, 10]
['mia', 20, 50]
['mia', 52, 101]
['mia', 220, 380]

Mój kod (który działa, ale chciałbym go zautomatyzować bez pisania {x0}} ręcznie):

print lines[1][1] - lines[0][2]
print lines[2][1] - lines[1][2]

Wynik:

10
2
119

Aby zautomatyzować ten proces drukowania, próbowałem użyć Loop for:

for x in lines:
    print lines[x][1] - lines[x-1][2]

I otrzymał błąd: TypeError: list indices must be integers, not list

Potem spróbowałem:

for int(x) in lines:
    print lines[int(x)][1] - lines[int(x)-1][2]

I otrzymał błąd: SyntaxError: can't assign to function call

Zbadałem Odejmowanie wartości ze wszystkich elementów listy 2D w Pythonie ale nie pomogła mi zrozumieć mojego problemu.

Każda pomoc jest doceniana, aby uzyskać zautomatyzowany proces arytmetyczny (albo za pomocą pętli for, więc mogę zrozumieć, jak mogłem poprawić mój kod powyżej lub inną strukturę). Punkty bonusowe za pokazanie, jak zdefiniować funkcję lub utworzyć definicję klasy, aby wykonać to zadanie.

2
warship 17 sierpień 2014, 03:18

4 odpowiedzi

Najlepsza odpowiedź

W pierwszym przypadku x in lines oznacza x przyjmuje wartość każdej linii. I.e., pierwszy x = ['mia', 5, 10], a następnie x = ['mia', 20, 50] ... to nie jest to, czego chcesz. Chcesz x = 0, x = 1 ...

Ale próbując po prostu wykonać x w liczbę całkowitą, pisząc {X1}}, co mówisz, jest na pierwszej iteracji pętli przypisać {x2}} do int(x) i tak dalej. Ale po lewej stronie jest wywołanie funkcji, co oznacza x i przekonwertuj go na int i nie można przypisać czegoś (listy w tym przypadku) do połączenia funkcyjnego.

To, co naprawdę chcesz zrobić, to zmienić prawą stronę twojego zapętlenia. Zamiast przejść przez listę Elementy , chcesz przejść przez indeksy .

for x in range(1,len(lines)):
    print lines[x][1] - lines[x-1][2]
1
TooTone 16 sierpień 2014, 23:30

Spróbuj tego, po prostu połączenie pętli umieszczonej w instrukcji drukowania dla wywołania

print '\n'.join(str(lines[x][1]-lines[x-1][2]) for x in xrange(1,len(lines)))
1
pseudonym 16 sierpień 2014, 23:57

Możesz także szalony bez użycia range dla wskaźników:

for (first, second) in zip(lines[:-1], lines[1:]):
    print second[1] - first[2]

zip lub {X1}} (istnieją niewielkie różnice w Python2) Utwórz Kto Płaskie ze wszystkich iterów, które są podane . Z Dokumentów:

Ta funkcja [ ZIP Zwraca listę Ktorek, gdzie krotka I-TH zawiera element I-T z każdej z sekwencji argumentów lub iterables.

Ponieważ zagwarantowane jest kolejność list, przyniesie to przesunięcie elementów przez wprowadzone plastry.

Tutaj pierwsze iterable jest wszystkie linie bez ostatniego, a drugi iterable to wszystkie linie z wyłączeniem pierwszego (indeksu 0).

1
Midnighter 17 sierpień 2014, 09:05

Powinieneś zrobić :

for x in range(1,len(lines)):
    #do something

Spowoduje to pętlę z 1 do len(lines) - 1

0
qbit 17 sierpień 2014, 09:50