Feature Requests item #1184678, was opened at 2005-04-17 19:05 Message generated for change (Comment added) made by poromenos You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=355470&aid=1184678&group_id=5470
Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Closed Resolution: Rejected Priority: 5 Submitted By: Poromenos (poromenos) Assigned to: Nobody/Anonymous (nobody) Summary: "replace" function should accept lists. Initial Comment: It would be nice if the "replace" function accepted lists/ tuples and replaced each item in the "old" list with the corresponding item in the "new" list. ---------------------------------------------------------------------- >Comment By: Poromenos (poromenos) Date: 2005-05-21 00:52 Message: Logged In: YES user_id=267121 Actually it would accept two lists, and replace item n in the first list with item n in the second list, in that order (so that you can condense multiple replace lines into one), but this feature is not that important anyway. ---------------------------------------------------------------------- Comment By: Martin v. Löwis (loewis) Date: 2005-05-21 00:48 Message: Logged In: YES user_id=21627 I'm rejecting this request, noticing that even the *specification* of the requested feature is tricky: Would "foobarfoo".replace([("foo","baz"), ("barf", "")] produce "bazbarbaz" or "bazfoo" IOW, would it first replace all occurrences of the first pair, then all occurrences of the second pair, or would it iterate over the list, replacing everything it can replace, and then start all over until nothing needs to be done? In the face of doubt, refuse the temptation to guess. ---------------------------------------------------------------------- Comment By: Poromenos (poromenos) Date: 2005-05-01 12:55 Message: Logged In: YES user_id=267121 Ah, okay. ---------------------------------------------------------------------- Comment By: Raymond Hettinger (rhettinger) Date: 2005-04-30 15:30 Message: Logged In: YES user_id=80475 Sorry, am not going to gum up the API for this. It doesn't come up much and when it does it is an easy problem. Each additional option on a function makes it harder to learn, use, and remember. Likewise, it complicates maintenance. Also, this one has its own complexities that make it worth avoiding (examples can be contrived when the for-loop version produces a different result than replacing each match as found). A good implementation would take time. It would involve regexps and have to be done for unicode objects. ---------------------------------------------------------------------- Comment By: Poromenos (poromenos) Date: 2005-04-30 12:48 Message: Logged In: YES user_id=267121 That is true, the alternative loop is quite usable, but the API change would be backwards-compatible, and the implementation is not very difficult... I just see this as a nice feature of replace, it's not really necessary if it'll break other stuff. ---------------------------------------------------------------------- Comment By: Raymond Hettinger (rhettinger) Date: 2005-04-29 17:10 Message: Logged In: YES user_id=80475 Given the multiple alternative input matches, this is a job for regular expressions. See the string.substitute() source code for an approach to making the transformation you outlined. I do not think multi-replace is sufficiently common to warrant a change to the API. If needed and if the regexp solution is too hard, then a regular for-loop is a reasonable alternative: for old, new in zip(oldlist, newlist): s = s.replace(old, new) ---------------------------------------------------------------------- Comment By: Poromenos (poromenos) Date: 2005-04-29 16:03 Message: Logged In: YES user_id=267121 There was an oversight on my part... Translate can only be used to change individual characters, what I am proposing could replace strings of multiple characters, essentially concatenating multiple replace()s in one: >>> "h.w".replace(["h", ".", "w"], ["Hello", " ", "World!"]) 'Hello, World!' ---------------------------------------------------------------------- Comment By: Poromenos (poromenos) Date: 2005-04-19 01:23 Message: Logged In: YES user_id=267121 Ah, I did not know that... The docs are a bit complicated on . translate, but since it can do that, yes, it would be unwise to implement my suggestion. ---------------------------------------------------------------------- Comment By: Raymond Hettinger (rhettinger) Date: 2005-04-19 01:20 Message: Logged In: YES user_id=80475 I'm -1 on complicating str.replace()'s API for functionality that substantially duplicates that offered by str.translate(): >>> "Hello world".translate(string.maketrans('ed', 'ae')) 'Hallo worle' ---------------------------------------------------------------------- Comment By: Poromenos (poromenos) Date: 2005-04-19 00:15 Message: Logged In: YES user_id=267121 Hmm, actually I was requesting that string.replace() accepted lists of substitutions, like so: >>> "Hello world".replace(["e", "d"], ["a", "e"]) 'Hallo worle' But your suggestion would also be very useful. ---------------------------------------------------------------------- Comment By: Raymond Hettinger (rhettinger) Date: 2005-04-19 00:11 Message: Logged In: YES user_id=80475 Are you requesting that lists be given a replace() method that parallels the replace() method for strings? def replace(self, old, new): result = [] for elem in self: if elem == old: result.append(new) else: result.append(elem) self[:] = result ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=355470&aid=1184678&group_id=5470 _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com