Jump to content

List comprehensions: Difference between revisions

Line 1,686:
 
<lang python>((x,y,z) for x in xrange(1,n+1) for y in xrange(x,n+1) for z in xrange(y,n+1) if x**2 + y**2 == z**2)</lang>
 
A slower but more readable version:
 
<lang python>[(x, y, z) for (x, y, z) in itertools.product(xrange(1,n+1),repeat=3) if x**2 + y**2 == z**2 and x <= y <= z]</lang>
 
Or as an iterator:
 
<lang python>((x, y, z) for (x, y, z) in itertools.product(xrange(1,n+1),repeat=3) if x**2 + y**2 == z**2 and x <= y <= z)</lang>
 
Alternatively we shorten the initial list comprehension but this time without compromising on speed. First we introduce a generator which generates all triplets:
 
<lang python>def triplets(n):
for x in xrange(1, n + 1):
for y in xrange(x, n + 1):
for z in xrange(y, n + 1):
yield x, y, z</lang>
 
Apply this to our list comprehension gives:
 
<lang python>[(x, y, z) for (x, y, z) in triplets(n) if x**2 + y**2 == z**2]</lang>
 
Or as an iterator:
 
<lang python>((x, y, z) for (x, y, z) in triplets(n) if x**2 + y**2 == z**2)</lang>
 
=={{header|R}}==
Cookies help us deliver our services. By using our services, you agree to our use of cookies.