tags:

views:

201

answers:

5

Let's say i have a multidimensional list l:

l = [['a', 1],['b', 2],['c', 3],['a', 4]]

and I want to return another list consisting only of the rows that has 'a' in their first list element:

m = [['a', 1],['a', 4]]

What's a good and efficient way of doing this?

+1  A: 
m = [i for i in l if i[0] == 'a']
Adam Bernier
A: 

With the filter function:

m = filter(lambda x: x[0] == 'a', l)

or as a list comprehension:

m = [x for x in l where x[0] == 'a']
sth
A: 

What's wrong with just:

m = [i for i in l if i[0] == 'a']

Or:

m = filter(lambda x: x[0] == 'a', l)

I doubt the difference between these will be significant performance-wise. Use whichever is most convenient. I don't like lambdas, but the filter can be replaced with itertools.ifilter for larger lists if that's a problem, but you can also change the list comprehension to a generator (change the [] to ()) to achieve the same general result. Other than that, they're probably identical.

Chris Lutz
A: 
[i for i in l if i[0]=='a']

btw, take a look at Python's list comprehension with conditions.

Yin Zhu
+4  A: 

Definitely a case for a list comprehension:

m = [row for row in l if 'a' in row[0]]

Here I'm taking your "having 'a' in the first element" literally, whence the use of the in operator. If you want to restrict this to "having 'a' as the first element" (a very different thing from what you actually wrote!-), then

m = [row for row in l if 'a' == row[0]]

is more like it;-).

Alex Martelli