Próbuję zmapować listę na heks, a następnie użyć listy w innym miejscu. W Pythonie 2.6 było to łatwe:
Odp .: Python 2.6:
>>> map(chr, [66, 53, 0, 94])
['B', '5', '\x00', '^']
Jednak w Pythonie 3.1 powyższe zwraca obiekt mapy.
B: Python 3.1:
>>> map(chr, [66, 53, 0, 94])
<map object at 0x00AF5570>
Jak pobrać zmapowaną listę (jak w A powyżej) w Pythonie 3.x?
Alternatywnie, czy jest na to lepszy sposób? Mój początkowy obiekt listy zawiera około 45 elementów i chciałbym przekonwertować je na hex.
python
list
python-3.x
map-function
mozami
źródło
źródło
map()
został prawie usunięty z języka, ponieważ nie ma powodu, aby używać go do interpretacji listy lubfor
pętli.Odpowiedzi:
Zrób to:
W Pythonie 3+ wiele procesów iterujących się nad iteracjami zwraca same iteratory. W większości przypadków kończy się to oszczędzaniem pamięci i powinno przyspieszyć.
Jeśli wszystko, co zamierzasz zrobić, to w końcu iterować tę listę, nie musisz nawet konwertować jej na listę, ponieważ nadal możesz iterować
map
obiekt:źródło
map
byłaby leniwa ocena podczas iteracji złożonej funkcji, dużych zbiorów danych lub strumieni.bytes(sequence_of_ints_in_range_0_to_256).decode('latin-1')
costr
przyspiesza dzięki unikaniu wywołań funkcji Pythona dla każdego elementu na korzyść masowej konwersji wszystkie elementy używające tylko wywołań funkcji poziomu C. Możesz owinąć powyższe,list
jeśli naprawdę potrzebujesz jednegolist
z pojedynczych znaków, ale ponieważstr
jest już iterowalny dla własnych znaków, jedynym powodem, dla którego to zrobiłeś, jest to, że potrzebujesz zmienności.Nowy i czysty w Pythonie 3.5:
Dzięki dodatkowym generalizacjom rozpakowywania
AKTUALIZACJA
Zawsze szukając krótszych dróg, odkryłem, że ten działa również:
Rozpakowywanie działa również w krotkach. Zwróć uwagę na przecinek na końcu. To sprawia, że jest to krotka 1 element. Oznacza to, że jest to równoważne z
(*map(chr, [66, 53, 0, 94]),)
Jest krótszy tylko o jeden znak z wersji z nawiasami listy, ale moim zdaniem lepiej pisać, ponieważ zaczynasz od gwiazdki - składni rozszerzenia, więc myślę, że jest to łagodniejsze. :)
źródło
list()
nie wygląda tak schludnielist
konstruktora i wywoływać mechanizmu wywoływania funkcji ogólnych. W przypadku długich danych wejściowych nie będzie to miało znaczenia; w skrócie może to mieć duże znaczenie. Używając powyższego kodu z danymi wejściowymi,tuple
aby nie był wielokrotnie odtwarzany,ipython
znaki mikrodruku pokazują, żelist()
podejście do zawijania zajmuje około 20% dłużej niż rozpakowanie. Pamiętaj, że w kategoriach absolutnych mówimy o 150 ns, co jest banalne, ale masz pomysł.map
? Może z nową nazwą (lmap
?), Jeśli nową wartością domyślną jest zwrócenie iteratora?*map()
daje błąd składni naPython 3.6
:can't use starred expression here
. Musisz umieścić go wlist
:[ *map() ]
Dlaczego tego nie robisz:
Nazywa się to zrozumieniem listy. Możesz znaleźć wiele informacji w Google, ale tutaj jest link do dokumentacji Pythona (2.6) na temat list . Jednak możesz być bardziej zainteresowany dokumentacją Python 3 .
źródło
map(chr, [66,53,0,94])
jest zdecydowanie bardziej zwięzły niż[chr(x) for x in [66,53,0,94]]
.Zaletą funkcji powrotu do listy jest oszczędność pisania, zwłaszcza podczas sesji interaktywnych. Możesz zdefiniować
lmap
funkcję (na zasadzie python2imap
), która zwraca listę:Wtedy zadzwonienie
lmap
zamiastmap
wykona zadanie:lmap(str, x)
jest krótsze o 5 znaków (w tym przypadku 30%) niżlist(map(str, x))
i na pewno jest krótsze niż[str(v) for v in x]
. Możesz także stworzyć podobne funkcjefilter
.Do pierwotnego pytania był komentarz:
Można to zrobić, ale to bardzo zły pomysł. Dla zabawy, oto jak możesz ( ale nie powinieneś ) to zrobić:
źródło
Konwertowanie mojego starego komentarza dla lepszej widoczności: dla „lepszego sposobu na zrobienie tego” bez
map
całkowicie, jeśli twoje dane wejściowe są znane jako porządki ASCII, generalnie znacznie szybciej jest konwertowaćbytes
i dekodować labytes(list_of_ordinals).decode('ascii')
. To daje ci jednąstr
z wartości, ale jeśli potrzebujeszlist
zmienności lub podobnej, możesz po prostu przekonwertować (i to jeszcze szybciej). Na przykład wipython
mikrodrukach przekształcających 45 danych wejściowych:Jeśli pozostawisz to jako
str
, zajmuje około 20% czasu najszybszychmap
rozwiązań; nawet powrót do listy to wciąż mniej niż 40% najszybszegomap
rozwiązania. Konwersja zbiorcza przez,bytes
abytes.decode
następnie konwersja zbiorcza z powrotemlist
oszczędza dużo pracy, ale jak wspomniano, działa tylko wtedy, gdy wszystkie dane wejściowe są w porządku ASCII (lub porządkami w jednym bajcie na kodowanie specyficzne dla ustawień regionalnych, nplatin-1
.).źródło
oznacza, że zwróci iterator.
oznacza, że następna funkcja iteratora pobierze jedną wartość z każdej iteracji i przekaże każdą z nich do jednego parametru pozycyjnego funkcji.
Więc dostajesz iterator z funkcji map () i jsut przekazuje go do wbudowanej funkcji list () lub używa wyrażeń listowych.
źródło
Oprócz powyższych odpowiedzi w
Python 3
, możemy po prostu stworzyćlist
wartości wynikają zmap
jakMożemy uogólnić na inny przykład, w którym zostałem trafiony, operacje na mapie mogą być również obsługiwane w podobny sposób, jak w przypadku
regex
problemu, możemy napisać funkcję, aby uzyskaćlist
elementy do mapy i uzyskać zestaw wyników w tym samym czasie. Dawny.źródło
Możesz spróbować uzyskać listę z obiektu mapy, po prostu iterując każdy element w obiekcie i przechowując go w innej zmiennej.
źródło
Używając rozumienia list w Pythonie i podstawowej funkcji mapy, można to zrobić również:
chi = [x for x in map(chr,[66,53,0,94])]
źródło