@DaniSpringer Ponieważ nie przypisujesz do listy. To to samo, co robienie lst = [1, 2, 3]; e = lst[0]; e += 1. enie ma żadnych informacji o tym, skąd się wzięło, jest to po prostu zmienna, do której został przypisany element listy. Po przypisaniu do niego czegoś innego lista lstsię nie zmieni.
Błażej Michalik
Cóż, ta odpowiedź wygląda bardzo podobnie do mnie.
Daniel Springer
a korespondent leniwy obliczył jeden:new_list = (x+1 for x in my_list)
Eduardo Pignatelli
26
>>> mylist = [1,2,3]
>>> [x+1for x in mylist]
[2, 3, 4]
>>>
Inne odpowiedzi dotyczące rozumienia listy są prawdopodobnie najlepszym rozwiązaniem do prostego dodawania, ale jeśli masz bardziej złożoną funkcję, którą musiałeś zastosować do wszystkich elementów, mapa może być dobrym dopasowaniem.
Jest to dobre do zmiany istniejącej listy, ale nadal tworzy nową. Czy używanie generatora w celu uniknięcia niepotrzebnego tworzenia listy jest niebezpieczne? Tj _list[:]=(i+1 for i in _list).
Alan
to wciąż tworzy nową listę, nie da się tego zrobić w miejscu bez pętli for Nie sądzę
robert king
Jak myślisz, dlaczego _list[:]=(i+1 for i in _list)tworzy nową listę?
Rozumiem, co masz na myśli. Nazywanie sekwencji tymczasowej listą wprawiło mnie w zakłopotanie. Czy faktycznie wiemy coś o jego typie? Czy nie byłoby to specyficzne dla implementacji?
Alan
9
>>> [x.__add__(1) for x in [1, 3, 5]]
3: [2, 4, 6]
Moim zamiarem jest tutaj ujawnienie, że jeśli pozycja na liście jest liczbą całkowitą, obsługuje różne wbudowane funkcje.
add powinien importować od operatorów,from operator import add
Rajith Thennakoon
0
Wiele z powyższych odpowiedzi jest bardzo dobrych. Widziałem też kilka dziwnych odpowiedzi, które wystarczą. Ponadto ostatnią widzianą odpowiedzią była normalna pętla. Ta gotowość do udzielania odpowiedzi prowadzi mnie do itertoolsi numpy, które wykonają tę samą pracę w inny sposób.
Tutaj przedstawiam różne sposoby wykonywania pracy, na które nie ma odpowiedzi powyżej.
import operator
import itertools
x = [3, 5, 6, 7]
integer = 89"""
Want more vairaint can also use zip_longest from itertools instead just zip
"""#lazy eval
a = itertools.starmap(operator.add, zip(x, [89] * len(x))) # this is not subscriptable but iterable
print(a)
for i in a:
print(i, end = ",")
# prepared list
a = list(itertools.starmap(operator.add, zip(x, [89] * len(x)))) # this returns list
print(a)
# With numpy (before this, install numpy if not present with `pip install numpy`)import numpy
res = numpy.ones(len(x), dtype=int) * integer + x # it returns numpy array
res = numpy.array(x) + integer # you can also use this, infact there are many ways to play around
print(res)
print(res.shape) # prints structure of array, i.e. shape# if you specifically want a list, then use tolist
res_list = res.tolist()
print(res_list)
Wynik
>>> <itertools.starmap object at 0x0000028793490AF0> # output by lazy val>>> 92,94,95,96, # output of iterating above starmap object>>> [92, 94, 95, 96] # output obtained by casting to list>>> __
>>> # |\ | | | |\/| |__| \ />>> # | \| |__| | | | |>>> [92949596] # this is numpy.ndarray object>>> (4,) # shape of array>>> [92, 94, 95, 96] # this is a list object (doesn't have a shape)
Mój jedyny powód, aby podświetlić wykorzystania numpyjest to, że zawsze trzeba robić takie manipulacje z bibliotek takich jak numpy ponieważ jest wydajność skuteczny dla bardzo dużych tablic.
lst = [1, 2, 3]; e = lst[0]; e += 1
.e
nie ma żadnych informacji o tym, skąd się wzięło, jest to po prostu zmienna, do której został przypisany element listy. Po przypisaniu do niego czegoś innego listalst
się nie zmieni.new_list = (x+1 for x in my_list)
>>> mylist = [1,2,3] >>> [x+1 for x in mylist] [2, 3, 4] >>>
listy składane python .
źródło
Inne odpowiedzi dotyczące rozumienia listy są prawdopodobnie najlepszym rozwiązaniem do prostego dodawania, ale jeśli masz bardziej złożoną funkcję, którą musiałeś zastosować do wszystkich elementów, mapa może być dobrym dopasowaniem.
W twoim przykładzie byłoby to:
>>> map(lambda x:x+1, [1,2,3]) [2,3,4]
źródło
map(1 .__add__, ...)
działa też. Zwróć uwagę, że potrzebujesz spacji między1
i,.
aby parser nie pomyślał, że to floatjeśli chcesz użyć numpy, jest następująca inna metoda
import numpy as np list1 = [1,2,3] list1 = list(np.asarray(list1) + 1)
źródło
Edycja: to nie jest na miejscu
Po pierwsze, nie używaj słowa „lista” dla swojej zmiennej. To przesłania słowo kluczowe
list
.Najlepiej zrobić to na miejscu za pomocą splicingu, zwróć uwagę na
[:]
oznaczenie połączenia:>>> _list=[1,2,3] >>> _list[:]=[i+1 for i in _list] >>> _list [2, 3, 4]
źródło
_list[:]=(i+1 for i in _list)
._list[:]=(i+1 for i in _list)
tworzy nową listę?>>> [x.__add__(1) for x in [1, 3, 5]] 3: [2, 4, 6]
Moim zamiarem jest tutaj ujawnienie, że jeśli pozycja na liście jest liczbą całkowitą, obsługuje różne wbudowane funkcje.
źródło
Python 2+:
>>> mylist = [1,2,3] >>> map(lambda x: x + 1, mylist) [2, 3, 4]
Python 3+:
>>> mylist = [1,2,3] >>> list(map(lambda x: x + 1, mylist)) [2, 3, 4]
źródło
import numpy as np np.add([1, 2, 3], 1).tolist()
co daje
[2, 3, 4]
źródło
Znalazłem niezbyt wydajny, ale wyjątkowy sposób na zrobienie tego. Więc dzielenie się tym i tak, wymaga dodatkowej przestrzeni na kolejną listę.
from operator import add test_list1 = [4, 5, 6, 2, 10] test_list2 = [1] * len(test_list1) res_list = list(map(add, test_list1, test_list2)) print(test_list1) print(test_list2) print(res_list) #### Output #### [4, 5, 6, 2, 10] [1, 1, 1, 1, 1] [5, 6, 7, 3, 11]
źródło
from operator import add
Wiele z powyższych odpowiedzi jest bardzo dobrych. Widziałem też kilka dziwnych odpowiedzi, które wystarczą. Ponadto ostatnią widzianą odpowiedzią była normalna pętla. Ta gotowość do udzielania odpowiedzi prowadzi mnie do
itertools
inumpy
, które wykonają tę samą pracę w inny sposób.Tutaj przedstawiam różne sposoby wykonywania pracy, na które nie ma odpowiedzi powyżej.
import operator import itertools x = [3, 5, 6, 7] integer = 89 """ Want more vairaint can also use zip_longest from itertools instead just zip """ #lazy eval a = itertools.starmap(operator.add, zip(x, [89] * len(x))) # this is not subscriptable but iterable print(a) for i in a: print(i, end = ",") # prepared list a = list(itertools.starmap(operator.add, zip(x, [89] * len(x)))) # this returns list print(a) # With numpy (before this, install numpy if not present with `pip install numpy`) import numpy res = numpy.ones(len(x), dtype=int) * integer + x # it returns numpy array res = numpy.array(x) + integer # you can also use this, infact there are many ways to play around print(res) print(res.shape) # prints structure of array, i.e. shape # if you specifically want a list, then use tolist res_list = res.tolist() print(res_list)
Wynik
>>> <itertools.starmap object at 0x0000028793490AF0> # output by lazy val >>> 92,94,95,96, # output of iterating above starmap object >>> [92, 94, 95, 96] # output obtained by casting to list >>> __ >>> # |\ | | | |\/| |__| \ / >>> # | \| |__| | | | | >>> [92 94 95 96] # this is numpy.ndarray object >>> (4,) # shape of array >>> [92, 94, 95, 96] # this is a list object (doesn't have a shape)
Mój jedyny powód, aby podświetlić wykorzystania
numpy
jest to, że zawsze trzeba robić takie manipulacje z bibliotek takich jak numpy ponieważ jest wydajność skuteczny dla bardzo dużych tablic.źródło
list = [1,2,3,4,5] for index in range(len(list)): list[index] = list[index] +1 print(list)
źródło