# 1-liner in Python

• Take the first row plus the spiral order of the rotated remaining matrix. Inefficient for large matrices, but here I got it accepted in 40 ms, one of the fastest Python submissions.

``````def spiralOrder(self, matrix):
return matrix and list(matrix.pop(0)) + self.spiralOrder(zip(*matrix)[::-1])``````

• awesome !!! but should the list() function be applied on later term (outside of zip)?

• You mean `list(zip(...))`? No, that makes no sense, as `zip` already returns a list (we have Python 2 here). I see you do that in your solution, and you don't need it. The reason I need it is because I use `+` to concatenate the parts, and my base case `matrix` is the empty list but `matrix.pop(0)` is usually a tuple (since `zip` creates a list of tuples). And "tuple+list" is not allowed, so I need to convert each tuple to a list. In your solution you can simply work with tuples because you use `extend`, and lists don't mind being extended by tuples.

Btw, in case you're wondering: It's not a coincidence that I posted mine so soon after yours, I had seen yours before posting mine. I had written mine about a month ago, though. Don't know why I didn't post it right away, maybe I wanted to post it together with my faster solution(s), which aren't polished yet...

• I see. Nice to learn this.

• Marvelous! I even don't realize that we could use `zip` like this! Brava!

• Really elegant solution! Thanks for sharing.

• oh my god!!!!!!

• Really clever use of a rotated matrix. Any idea how large the memory footprint is? Seems like you'll be making a number of copies of the matrix (although it will be decremented by a row/column repeatedly).

• run-time error, but it succeed in visual studio, can anyone help me?

``````    vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
if(matrix.empty()) return res;
int m = matrix.size();
int n = matrix[0].size();

int row=0,col=0;
int dir=0,left=0,right=n-1,bottom=0,up=m-1;
for(int i=0;i<m*n;++i)
{
res.push_back(matrix[row][col]);
switch(dir)
{
case 0://right
if(col == right)
{
dir++;bottom++;row++;
}
else
col++;
break;
case 1:
if(row == up)
{
dir++;right--;col--;
}
else
row++;
break;
case 2:
if(col == left)
{
dir++;up--;row--;
}
else
col--;
break;
case 3:
if(row == bottom)
{
dir=0;left++;col++;
}
else
row--;
break;
}
}
return res;
}``````

• Sir, I think you can publish a book with a title like "Think in Python" or "Pythonic Coding".

• Elegant solution! But much slower than others. Is it rebuilding a list to pass matrix for recursion, or zip, or reverse matrix slowing down?

• @oscartsai said in 1-liner in Python:

applied on later term (outside of zip)?

in python3.6, it should be add list() on the last termã€‚
*return matrix and list(matrix.pop(0)) + spiralOrder(list(zip(matrix))[::-1])

• @algowl said in 1-liner in Python:

much slower than others

What do you mean?

• @StefanPochmann said in 1-liner in Python:

@algowl said in 1-liner in Python:

much slower than others

What do you mean?

Your runtime beats 1.60 % of python submissions.

• @algowl That's not true. I just submitted it five times and it beat 9%, 18%, 69%, 69% and 51%. And earlier today, right before I asked you, I had submitted it three times and it beat 51%, 51% and 67%. How often did you submit it? What were the individual results?

• @StefanPochmann First, thanks for your solution.It helps me a lot. But, for this question, it justs the difference between py2 and py3. I test in my local environment.
Just like this:
A = [[1, 2], [3,,4]]
zip(*A)[::-1]
In py2, it can pass.
But in py3.6, it gives the error likes "TypeError: 'zip' object is not subscriptable".
So, in leetcode, it supports the py2 and py3, it can be passed.
That all.Thanks.

• @StefanPochmann You are right. It does have a wide distribution, or the variance is too large. Sorry about the false alarm.

• This is such an elegant solution. Also learnt the star expression. Thanks!

• This post is deleted!

Looks like your connection to LeetCode Discuss was lost, please wait while we try to reconnect.