Thanks to all for the quick responses. 2008/8/25 Ben Finney <[EMAIL PROTECTED]>:
> This is a 'dict' instance in Python. A 'hash' is a different concept. > >> In order to strip the dict values in Python I (think) I can only do >> something like: >> >> for k,v in h.items: >> h[k] = v.strip() > > The above won't do what you describe, since 'h.items' evaluates to > that function object, which is not iterable. If you want the return > value of the function, you must call the function: > > for (k, v) in h.items(): > h[k] = v.strip() > Yes - absolutely, a typo on my part. > This will create a new value from each existing value, and re-bind > each key to the new value for that key. Clear, straightforward, and > Pythonic. > > You can also create a new dict from a generator, and re-bind the name > to that new dict: > > h = dict( > (k, v.strip()) > for (k, v) in h.items()) > > Also quite Pythonic, but rather less clear if one hasn't yet > understood generator expressions. Very useful to have when needed, > though. > Thanks for this - I'll have a look! >> While in Ruby - for the equivale dict/hash - I have the option of an >> in-place method: >> >> h.each_value { |v| val.strip! } >> >> Are there Python equivalents to the "!" methods in Ruby? > > I'm not overly familiar with Ruby, but the feature you describe above > seems to rely on mutating the string value in-place. Is that right? > There are a number of methods that can be used to change things "in-place" such as: >> String.new().grep_methods("!") => ["upcase!", "gsub!", "downcase!", "chop!", "capitalize!", "tr!", "chomp!", "swapcase!", "tr_s!", "succ!", "strip!", "delete!", "lstrip!", "squeeze!", "next!", "rstrip!", "slice!", "reverse!", "sub!"] Or, >> Array.new().grep_methods("!") => ["map!", "shuffle!", "uniq!", "reject!", "compact!", "slice!", "sort!", "flatten!", "collect!", "reverse!"] They normally have a non-"!" partner which is used only for a return value and does not affect the original object. But! This isn't a Ruby group so I'll stop now... ;-) > Strings in Python are immutable (among other reasons, this allows them > to meet the requirement of dict keys to be immutable, which in turn > allows dict implementations to be very fast), so you can only get a > new value for a string by creating a new string instance and re-bind > the reference to that new value. Normally I would use a Ruby symbol as a hash key: h = { :key1 => "val1", :key2 => "val2" } >From the stdlib docs: "The same Symbol object will be created for a given name or string for the duration of a program's execution, regardless of the context or meaning of that name. Thus if Fred is a constant in one context, a method in another, and a class in a third, the Symbol :Fred will be the same object in all three contexts. " There is no equivalent in Python (as far as I know, and I'm only in my second week of Python so I'm more than likely incorrect!). If you're interested: http://www.randomhacks.net/articles/2007/01/20/13-ways-of-looking-at-a-ruby-symbol Thanks again for the pointers. -- Simon Mullis _________________ [EMAIL PROTECTED] -- http://mail.python.org/mailman/listinfo/python-list