Jeśli mam list=[1,2,3]
i chcę dodać 1
do każdego elementu, aby uzyskać dane wyjściowe [2,3,4]
, jak mam to zrobić?
Zakładam, że użyłbym pętli for, ale nie wiem dokładnie, jak.
Odpowiedzi:
new_list = [x+1 for x in my_list]
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 lista lst
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]
>>>
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]
map(1 .__add__, ...)
działa też. Zwróć uwagę, że potrzebujesz spacji między 1
i, .
aby parser nie pomyślał, że to float
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]
_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.
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]
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]
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
i 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
>>> __
>>> # |\ | | | |\/| |__| \ /
>>> # | \| |__| | | | |
>>> [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.