Mam listę z ciągami liczbowymi, takimi jak:
numbers = ['1', '5', '10', '8'];
Chciałbym przekonwertować każdy element listy na liczbę całkowitą, więc wyglądałoby to tak:
numbers = [1, 5, 10, 8];
Mógłbym to zrobić za pomocą pętli:
new_numbers = [];
for n in numbers:
new_numbers.append(int(n));
numbers = new_numbers;
Czy to musi być takie brzydkie? Jestem pewien, że istnieje bardziej pythonowy sposób na zrobienie tego w jednym wierszu kodu. Proszę pomóż mi.
Odpowiedzi:
Do tego służą listy ze zrozumieniem :
źródło
W Python 2.x innym podejściem jest użycie
map
:Uwaga: w Python 3.x
map
zwraca obiekt mapy, który możesz przekonwertować na listę, jeśli chcesz:źródło
map
zwraca iterator zamiast listy, więc należy go zapisać tak,list(map(int, numbers))
jakby potrzebna była lista.map
ma wyższe koszty instalacji, ale w interpretatorze referencyjnym, jeśli funkcja transformacji jest wbudowaną funkcją Pythona zaimplementowaną w C, ma niższy koszt jednostkowy. Testowanie na wejściu tylko czterech wartości nie dostarczy przydatnych informacji na temat skalowania. To powiedziawszy, w moich własnych testach (na Py2.7.12 i Py3.5.2, ten ostatni zlist()
zawijaniem), Py2map
wygrał nawet dla czterech elementów wejściowych i traci tylko niewielki margines na Py3; Podejrzewam, że twoje testy zostały wypaczone na korzyść listcomps.tylko punkt
zrozumienie listy jest bardziej naturalne, podczas gdy
jest szybszy.
Prawdopodobnie w większości przypadków nie będzie to miało znaczenia
Przydatna lektura: LP vs mapa
źródło
Jeśli zamierzasz przekazać te liczby całkowite do funkcji lub metody, rozważ ten przykład:
Konstrukcja ta jest celowo niezwykle podobna do opisów list wspomnianych przez adamk. Bez nawiasów kwadratowych nazywa się to wyrażeniem generatora i jest bardzo wydajnym sposobem na przekazanie listy argumentów do metody. Dobra dyskusja jest dostępna tutaj: Wyrażenia generatora vs. Zrozumienie listy
źródło
Kolejny sposób, aby zrobić to w Pythonie 3:
numbers = [*map(int, numbers)]
źródło
[]
listę argumentów. I nie wiedziałem, że możesz przekazać iterator jako listę argumentów. Myślałbym zrobićnumber = list(map(int, numbers))
. Ale dzięki za wyjaśnienie!Inny sposób,
źródło
Pomyślałem, że skonsoliduję odpowiedzi i pokażę kilka
timeit
wyników.Python 2 jest do tego bardzo kiepski, ale
map
jest nieco szybszy niż rozumienie.Sam Python 3 jest ponad 4x szybszy, ale konwertuje
map
obiektu generatora na listę jest wciąż szybsza niż zrozumienie, a tworzenie listy przez rozpakowaniemap
generatora (dzięki Artem!) Jest jeszcze nieco szybsze.Uwaga: W Pythonie 3 4 elementy wydają się być punktem podziału (3 w Pythonie 2), w którym rozumienie jest nieco szybsze, chociaż rozpakowywanie generatora jest wciąż szybsze niż w przypadku list zawierających więcej niż 1 element.
źródło