2016-03-15 37 views
13

Jaki jest najbardziej pytonowy sposób wykonywania operacji arytmetycznych na każdej n-tej wartości na liście? Na przykład, jeśli zacznę listy1:Edytuj wartość każdego N-tego elementu na liście

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

chciałbym dodać 1 do każdego drugiego elementu, który mógłby sprawiać:

list2 = [1, 3, 3, 5, 5, 7, 7, 9, 9, 11] 

próbowałem:

list1[::2]+1 

a także:

for x in list1: 
    x=2   
    list2 = list1[::x] + 1 

Odpowiedz

16

Można użyć slicing z listowego następująco:

In [26]: list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

In [27]: list1[1::2] = [x+1 for x in list1[1::2]] 

In [28]: list1 
Out[28]: [1, 3, 3, 5, 5, 7, 7, 9, 9, 11] 
+0

zauważyłem wiele osób umieścić ich odpowiedzi w tym formacie. Jak to generujesz? – Igor

+2

Korzystanie z konsoli w Enthought Canopy. Czy używasz konsoli? – gtlambert

+1

Piszę kod w Notepad ++ i po prostu użyję interpretera wiersza poleceń Pythona, kiedy będę musiał coś wypróbować. Nie mam uprawnień administratora na komputerze, na którym piszę większość mojego kodu. Czym różni się konsola od interakcyjnego interpretera ('' >>> '') – Igor

4

Użyj enumerate a list comprehension

>>> list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> [v+1 if i%2!=0 else v for i,v in enumerate(list1)] 
[1, 3, 3, 5, 5, 7, 7, 9, 9, 11] 
3
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
for i in range(1, len(list1), 2): 
    list1[i] +=1 
print(list1) 

użyciu i% 2 nie wydaje się bardzo skuteczny

+1

To '%' nie jest wydajne mogło mieć rację 20 lat temu. Na każdym nowoczesnym procesorze jest tak szybki, jak każda inna podstawowa operacja matematyczna. –

+0

'% 2' jest niezwykle wydajny w przypadku typów integralnych. Dla dzielników, które nie są potęgami dwóch, nie tak bardzo. –

8

numpy pozwala na użycie += operację z plasterkami też:

In [15]: import numpy as np 

In [16]: l = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) 

In [17]: l[1::2] += 1 

In [18]: l 
Out[18]: array([ 1, 3, 3, 5, 5, 7, 7, 9, 9, 11]) 
1

Spróbuj tego:

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
for i in range(1,len(list1),2): 
    list1[i] += 1 
+0

Przykleję mi szyję i powiem, że wolę tę odpowiedź od krojenia. Czemu? Ponieważ jest to instancja ogólnej formy, która jest niezwykle Pythoniczna i niezwykle potężna: 'for i in generator (args):' – nigel222

+3

Wygląda jak dokładny duplikat odpowiedzi Divisadero opublikowanej 10 minut wcześniej. –

1

Można utworzyć iterator reprezentujący Delta (itertools.cycle([0, 1]) a następnie dodać jej elementów do istniejącej listy.

>>> list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> [a + b for a,b in zip(list1, itertools.cycle([0,1]))] 
[1, 3, 3, 5, 5, 7, 7, 9, 9, 11] 
>>> 
1
a = [i for i in range(1,11)] 
#a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
b = [a[i]+1 if i%2==1 else a[i] for i in range(len(a))] 
#b = [1, 3, 3, 5, 5, 7, 7, 9, 9, 11] 
+0

Witamy w Stack Overflow! Chociaż ten fragment kodu może rozwiązać pytanie, [w tym wyjaśnienie] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-ans -answers) naprawdę pomaga poprawić jakość twojego postu. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. - [Z recenzji] (https://stackoverflow.com/review/low-quality-posts/11679194) – Ferrybig