Here is one way to do it, not sure if it is the most efficient, but this works for me on Rackspace cloud servers. Note that because spinning up a server is an asynchronous task it is necessary to wait for the server to be operational before extracting the IP address.
ip_address = None
for network in server.networks['public']:
if re.match('\d+\.\d+\.\d+\.\d+', network):
ip_address = network
break
if ip_address is None:
print 'No IP address assigned!'
sys.exit(1)
print 'The server is waiting at IP address {0}.'.format(ip_address)
This example is part of an article I wrote on the nova
APIs, as supported by Rackspace. The full article is here.