Extracting item from list of tuples?

Peter Otten __peter__ at web.de
Sun Sep 5 13:45:53 EDT 2010


Philip Semanchuk wrote:

> 
> On Sep 5, 2010, at 1:09 PM, Roy Smith wrote:
> 
>> I'm using httplib, and want to get the Location header from the
>> response.  The getheaders() method gives you back a list of (name,
>> value) tuples.  It would be a lot more convenient if it gave you
>> back a
>> dict, but it is what it is.
>>
>> Anyway, I came up with:
>>
>>    location = [t[1] for t in headers if t[0] == 'location'][0]
>>
>> which works, but is getting on towards the cryptic end of things.  Is
>> there a better idiom for this?
> 
> Are you concerned about efficiency? If it's not important, being less
> terse would make it less cryptic:
> location = None
> for name, value in headers:
>     if name == "location":
>        location = value
>        break

This is actually more efficient because unlike Roy's (and your other 
solution) it doesn't build a list, and it doesn't waste cycles in the loop 
once the location is found. You can write it as a generator expression like 
so:

location = next((value for name, value in headers if name == "location"), 
None)

But just converting the headers to a dict is clearer and probably even 
faster because it moves the loop from Python to C.
 
> If you prefer terse, IMHO this is less cryptic (but untested):
> 
>     location = [value for name, value in headers if name == 'location']
> [0]
> 
> 
> Be careful if you decide to turn the list of tuples into a dictionary.
> HTTP headers can repeat and straightforward code to turn the (name,
> value) pairs into a dict could end up overwriting data.




More information about the Python-list mailing list