1.
import
random
2.
3.
def
gera_numeros(n,inf, sup):
4.
res
=
[]
5.
for
i
in
range(n):
6.
num
=
random.randint(inf,sup)
7.
res.append(num)
8.
return
res
1.
def
gera_numeros_b(n,inf, sup):
2.
res
=
[ random.randint(inf,sup)
for
i
in
range(n)]
3.
return
res
Elevar os números de aula lista ao quadrado:
1.
def
quadrados(lista):
2.
return
[elem
*
*
2
for
elem
in
lista]
1.
def
escalar_comp(x,y):
2.
""" Produto escalar de dois vectores."""
3.
return
sum([x[i]
*
y[i]
for
i
in
range(len(x))])
Somas parciais (percorrer a lista e gerar uma nova list em que na posição i é colocada a soma dos números da primeira lista desde o início até (inclusive) i):
1.
def
somas_parciais(lista):
2.
""" somas de 1 a i."""
3.
return
[sum(lista[:i
+
1
])
for
i
in
range(len(lista))]
1.
def
my_map(func, lista):
2.
return
[func(elem)
for
elem
in
lista]
1.
def
filtro_nega(lista):
2.
return
[ elem
for
elem
in
lista
if
elem >
0
]
1.
def
ocorre(elem, lista):
2.
""" localizaçoes das ocorrências de elem na lista."""
3.
return
[ i
for
i
in
range(len(lista))
if
lista[i]
=
=
elem]
1.
def
conta(elem, lista):
2.
"""Quantas ocorrências de elem na lista."""
3.
return
sum([
1
for
e
in
lista
if
e
=
=
elem])
1.
def
combina(a,b):
2.
""" pares ordenados com elementos de a e de b."""
3.
res
=
[]
4.
for
elem_a
in
a:
5.
for
elem_b
in
b:
6.
res.append((elem_a,elem_b))
7.
return
res
1.
def
combina_b(a,b):
2.
return
[(elem_a,elem_b)
for
elem_a
in
a
for
elem_b
in
b]
Um exemplo simples consiste em obter a lista dos elementos de uma lista de listas:
1.
def
aplana(lista_listas):
2.
"""Aplanar uma lista de listaas."""
3.
return
[elem
for
linha
in
lista_listas
for
elem
in
linha ]
1.
def
transposta_b(matriz):
2.
"""transposta de uma matriz."""
3.
return
[ [matriz[j][i]
for
j
in
range(len(matriz))]
for
i
in
range(len(matriz[
0
]))]
1.
def
roda_90(imagem):
2.
""" Rodar 90 graus uma imagem."""
3.
img_trans
=
transposta_b(matriz)
4.
nova_imagem
=
[linha[::
-
1
]
for
linha
in
img_trans]
5.
return
nova_imagem
1.
def
pitagoras(n):
2.
return
[(x,y,z)
for
x
in
range(
1
,n)
for
y
in
range(
1
,n)
for
z
in
range(
1
,n)
if
x
*
*
2
+
y
*
*
2
=
=
z
*
*
2
]
1.
def
pitagoras_b(n):
2.
return
[(x,y,z)
for
x
in
range(
1
,n)
for
y
in
range(x,n)
for
z
in
range(y,n)
if
x
*
*
2
+
y
*
*
2
=
=
z
*
*
2
]
1.
def
fermat(n,k):
2.
return
[(x,y,z)
for
x
in
range(
1
,n)
for
y
in
range(x,n)
for
z
in
range(y,n)
if
x
*
*
k
+
y
*
*
k
=
=
z
*
*
k]
1.
def
my_replace(novo, velho,lista):
2.
return
[novo
if
elem
=
=
velho
else
elem
for
elem
in
lista]
1.
def
negativo_img(imagem):
2.
return
[[
0
if
elem
=
=
1
else
1
for
elem
in
linha]
for
linha
in
imagem]
1.
def
primos(n):
2.
up
=
int(math.sqrt(n))
3.
no_primes
=
[j
for
i
in
range(
2
,up
+
1
)
for
j
in
range(i
*
*
2
,n
+
1
,i)]
4.
return
[ x
for
x
in
range(
2
,n
+
1
)
if
x
not
in
no_primes]
como posso fazer algo como:
ResponderEliminardef zf(n):
n = str(n)[::-1]
x = 0
for i in n:
if i == '0':
x += 1
else:
break
return x
em lista compreensão? eu sinto que é possível de acordo com a sua explicação, e deve ser um truque com outros comando que ainda posso não estar familiarizado.
Caro Leo,
ResponderEliminarO problema com o seu exemplo reside no facto de ter o BREAK, isto é, querer interromper a lista por compreensão. Isso não pode ser feito com listas por compreensão de modo simples. Mas podemos fazer algo... Admito que o que pretende com o seu programa é contar quantos zeros à direita tem um número. Aqui vai uma solução.
from itertools import takewhile
def zf_iter_2(n):
return sum([1 for i in takewhile((lambda i: i=='0'), str(n)[::-1])])
Como vê uso a função TAKEWHILE para gerar a lista com os elementos que satisfazem a condição. Claro que não precisa de listas por compreensão, basta fazer:
len(list(takewhile((lambda i: i=='0'), str(n)[::-1])))