Start | map
 

map(function, iterable, *iterables)



Applicerar en funktion på alla element i en lista och ger tillbaka en lista med svaren.

Funktion på alla element

T.ex. räknar alla bokstäver i listan.
bilar = ["volvo", "lada", "ferrari","bmw"] def minFun(a): return len(a) x = map(minFun, bilar) print(x) # OBS vi måste omvandla det till lista för # kunna se resultatet enkelt print(list(x))

Uppercase

Omvandlar alla orden till ord med versaler.
bilar = ["volvo", "lada", "ferrari","bmw"] def VERSALER(a): return a.upper() x = map(VERSALER, bilar) print(list(x))

3 argument

Säg att vi vill multiplicera 2 listor.
lista1 = [1,2,3,4,5] lista2 = [2,3,4,5,6] def multiplicera(x,y): return(x*y) x = map(multiplicera, lista1, lista2) print(list(x))
Observera att map är väldigt bra kompis med lambda. Vi kan dunka in funktionen direkt med lambda.
lista1 = [1,2,3,4,5] lista2 = [2,3,4,5,6] x = map(lambda x,y:x*y, lista1, lista2) print(list(x))

4 argument ...


Det första argumentet är alltid funktionen. Resterande argument matchar mot de eventuella parametrar som första funktionen behöver. Vi tar siffrorna i första listan och multiplicerar med andra listan och subtraheter slutligen siffrorna från 3:e listan.
lista1 = [1,2,3,4,5] lista2 = [2,3,4,5,6] lista3 = [1,2,3,4,5] x = map(lambda x,y,z:x*y-z, lista1, lista2, lista3) print(list(x))

Kontrollsiffra för personnummer

På wikipedia finns Luhns algoritm presenterad och deras python -kod ser ut som nedan. En orgie i map! I korthet ger den ifrån sig True om personnumrets kontrollsiffra stämmer annars inte.
s="8112189876" print((sum(map(lambda x: x%10 + int(x/10), map(lambda x,y: x*y, map(int, s), [2,1]*5))))%10 == 0)

Koden på wikipedia förklarad


Luhn's algoritm på wikipedia ser väldigt klurig och kompakt ut. Jag förklarar den här nedan. Vad vi har att göra med är ett funktionellt synsätt på att lösa ett problem.

Okej, eftersom vi ska multiplicera varannant tal med 2 och varannat med 1, så kan vi tänka oss en lista med person-numrets siffror och en annan lista med 2 och 1 ömsom och sedan multiplicerar vi dem med varandra. Ok?

Vi skapar en lista 2,1,2,1,2,1 ...
print([2,1]*5)
Vi måste också göra om personnumret till en lista med nummer. Så, vi kan använda funktionen map för att applicera int på alla tecken i strängen, ett i taget såklart. Vi använder här list() för att tydligt se listan.
s="8112189876" print(list(map(int, s))) print([2,1]*5)
Nu har vi en lista med 2,1,2,1, ... och vi har en lista med våra nummer. Okej, då multiplicerar vi ihop dem. Funktionen map kan ta 3 argument. Det första är funktionen vi vill köra på de 2 andra listorna. Om funktionen har 2 parametrar (i detta fall x och y), så plockar map x från det andra argumentet och y från den tredje argumentet. Dvs map multiplicerar - tal för tal - siffrorna i lista 2 med siffrorna i lista 3.

Lambda är en funktion som tar 2 argument (den ena och andra listan) och tal för tal multiplicerar ihop dem.
s="8112189876" print(list(map(lambda x,y: x*y, map(int, s), [2,1]*5)))
Nu måste vi snegla lite på hur algoritmen skulle jobba. Om vi tar 8 * 2 = 16 som exempel. Då skulle ju 16 hanteras som 1+6 = 7. Titta ovan på hur algoritmen fungerar om du tappat bort detta. Vi kan göra detta stunt, separera siffrorna och summera dem, i ett svep.

Om vi har 16 t.ex., så kan vi få fram 6:an genom att ta 16%10 och vi kan få fram 1:an genom att dela med 10 och plocka heltalet. Dvs vi får summan 1+6 och vi gör 10%10 + int(16/10) = 7. Är siffran mindre än 10, t.ex. 9 då kommer 9%10 bli 9 och int(9/10) bli 0 dvs 9+0=9. Alla siffror under 10 blir siffran själv. Så vårt trix arbetar bara på siffror större än 9, t.ex. 11 kommer bli 1+1 = 2 eller 13 kommer bli 1+3=4.

Jag lägger både före och efter här nedan så du kan jämföra resultatet.
s="8112189876" s="8112189876" print(list(map(lambda x,y: x*y, map(int, s), [2,1]*5))) print(list(map(lambda x: x%10 + int(x/10), map(lambda x,y: x*y, map(int, s), [2,1]*5))))
Nu ska vi summera alla dessa.
s="8112189876" print(sum(map(lambda x: x%10 + int(x/10), map(lambda x,y: x*y, map(int, s), [2,1]*5))))
och efter att vi summerat siffrorna ska vi kolla om det är delbart med 10. Om det är delbart med 10 skall det returnera True.
s="8112189876" print((sum(map(lambda x: x%10 + int(x/10), map(lambda x,y: x*y, map(int, s), [2,1]*5))))%10 == 0)
16.979932785034 ms