[Thomas Lehmann] > In C++, programming STL you will use the insert method which always > provides a position and a flag which indicates whether the position > results from a new insertion or an exisiting element. Idea is to have > one search only. > > <code> > if data.has_key(key): > value = data[key] > </code> > > But this does mean (does it?) that the dictionary is searched two > times! If so, can somebody show me how to do this in one step?
Several thoughts for you: * Python isn't C++ * Dict lookups in Python are ubiquitous * Trying to avoid them is often an exercise in futility * Because of cache effects, double lookups are *very* cheap * If this particular fragment is critical, consider using get(): data_get = data.get ... # inner-loop code value = data_get(key) # assigns None for missing values * Another alternative is a try-block: try: # setup is cheap value = data[key] except KeyError: # matching is expensive ... * Or you can use collections.defaultdict() or a dict subclass that defines __missing__(). * In general though, think of dicts as one of Python's most optimized structures, one that should be embraced rather than avoided. * Tim Peter's take on the subject from year's ago (paraphrased): "Anything written using Python dictionaries is a gazillion times faster than C". Raymond -- http://mail.python.org/mailman/listinfo/python-list