[Tutor] Example of good use of enumerate()

Peter Otten __peter__ at web.de
Sun Mar 13 10:47:36 EDT 2022


On 13/03/2022 12:25, Manprit Singh wrote:
 >
 > On Sun, Mar 13, 2022 at 4:44 PM Manprit Singh <manpritsinghece at gmail.com>
 > wrote:
 >
 >> Dear Sir,
 >>
 >> Consider an example of printing all elements of a principal diagonal
of a
 >> rectangular matrix.
 >> lx = [[2, 5, 9, 0],
 >>         [3, 8, 1, 5],
 >>         [4, 8, 1, 2],
 >>         [6, 1, 2, 4],
 >>         [3, 1, 6, 7]]
 >>
 >> for i, nlist in enumerate(lx):
 >>      for j, num in enumerate(nlist):
 >>          if i==j:
 >>              print(num)

I don't like that because you are discarding almost every matrix value here.

> One can solve it like this also:

> mlen = min(len(lx), len(lx[0]))
> for i in range(mlen):
>      print(lx[i][i])

I think the solution above is the best approach.

 > What do you suggest ?

You can avoid both range() and len() with

 >>> def diag(m):
	try:
		for i, row in enumerate(m):
			yield row[i]
	except IndexError:
		pass


 >>> list(diag(["ab", "cd"]))
['a', 'd']
 >>> list(diag(["abc", "def"]))
['a', 'e']
 >>> list(diag(["ab", "cd", "ef"]))
['a', 'd']

though I'm not sure I'm seriously suggesting this ;)


More information about the Tutor mailing list