[Python-ideas] proposed methods: list.replace / list.indices

David Kreuter dkreuter at gmail.com
Sun Dec 30 05:59:28 CET 2012


On Sun, Dec 30, 2012 at 5:03 AM, MRAB <python at mrabarnett.plus.com> wrote:

> On 2012-12-30 03:25, David Kreuter wrote:
>
>> Hi python-ideas.
>>
>> I think it would be nice to have a method in 'list' to replace certain
>> elements by others in-place. Like this:
>>
>>      l = [x, a, y, a]
>>      l.replace(a, b)
>>      assert l == [x, b, y, b]
>>
>> The alternatives are longer than they should be, imo. For example:
>>
>>      for i, n in enumerate(l):
>>          if n == a:
>>              l[i] = b
>>
>> Or:
>>
>>      l = [b if n==a else n for n in l]
>>
>> And this is what happens when someone tries to "optimize" this process.
>> It totally obscures the intention:
>>
>>      try:
>>          i = 0
>>          while i < len(l):
>>              i = l.index(a, i)
>>              l[i] = b
>>              i += 1
>>      except ValueError:
>>          pass
>>
>> If there is a reason not to add '.replace' as built-in method, it could
>> be implemented in pure python efficiently if python provided a version
>> of '.index' that returns the index of more than just the first
>> occurrence of a given item. Like this:
>>
>>      l = [x, a, b, a]
>>      for i in l.indices(a):
>>          l[i] = b
>>
>> So adding .replace and/or .indices… Good idea? Bad idea?
>>
>>  What's your use-case?
>
> I personally can't remember ever needing to do this (or, if I have, it
> was so long ago that I can't remember it!).
>
> Features get added to Python only when someone can show a compelling
> reason for it and sufficient other people agree.
> ______________________________**_________________
> Python-ideas mailing list
> Python-ideas at python.org
> http://mail.python.org/**mailman/listinfo/python-ideas<http://mail.python.org/mailman/listinfo/python-ideas>
>

When I write code for processing graphs it becomes very useful. For example:

    def collapse_edge_undirected_graph(a, b):
        n = Node()
        n.connected = a.connected + b.connected
        for x in a.connected:
            x.connected.replace(a, n)
        for x in b.connected:
            x.connected.replace(b, n)

In other cases one would probably just add another layer of indirection.

    x = Wrapper("a")
    y = Wrapper("y")
    a = Wrapper("a")

    l = [x, a, y, a]
    a.contents = "b" # instead of l.replace(a, b)

But having to add .contents everywhere makes it messy. Graph code is
complicated enough as it is.

And '.index' is a basically a resumable search. But instead of using a
iterator-interface it requires the user to call it repeatedly.
A method '.indices' returning a generator seems more like the python way to
approaching this.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20121230/5843b5af/attachment.html>


More information about the Python-ideas mailing list