Q:

Generate two different list comprehensions using a single iterable

For getting the major and minor diagonal of a matrix I could use:
major, minor = list(
    map(list, zip(*([(row[i], row[-i - 1]) for i, row in enumerate(mat)]))))

But, does there exist a better (pythonic) way of selecting the items in list comprehensions so that I don't have to transpose it later? 
Also can it be extended to creating more lists(eg. 3 separate lists for int's, strings and floats in a list)? 

A:

There really is no need to go to such lengths to use one list comprehension. It is less readable, harder to maintain, and no faster than using two separate list comprehensions:
major = [row[i] for i, row in enumerate(mat)]
minor = [row[-i] for i, row in enumerate(mat, 1)]

Yes, the zip(*...) trick can be used to extract any number of elements from a list of tuples, just produce more elements in the tuple. However, the technique does should simply not be used.

