I accept your viewpoint, but I unfortunately disagree. Code that self-documents its correctness is the best code and I feel we already have the explicit outcome for discard that this is proposing to take away. If I have some variables and I do
# example code; I have plenty of similar snippets in codebases though
# Remove x from current state
self.options.discard(x)
self.actions.discard(x)
self.layers.discard(x) # silent footgun: x could still be in this list!
# as opposed to
self.options.discard(x)
self.actions.discard(x)
if x in self.layers:
self.layers.remove(x) # explicitly removing only the first entry
then I lose the visual separation that I am dealing with different containers with different behaviors, and that the discard action has a different result compared to my expectation of them all being sets. (Maybe there is a linting hint that can identify it, but I personally view lint as a bandaid for mistakes that result from bad language design, so to me that is not a valid argument in this discussion as it puts the cart before the horse.)
For over twenty years, I have mixed sets and lists in ways resembling this depending on my needs to track state. I discard things to make sure they aren’t present in my set. It is the only discard that Python’s structures have ever had, so it has taken that meaning by sheer usage.
That is the underlying goal of why I use it, and the set implemented this implication and separation as early as Python 2.3. You can’t discard from a list because discarding is a set operation. Sure, it means exactly ‘remove one if it is there’ on a programmatic level, but for all these decades, the end result of this method has been “after running s.discard(x) the invariant x not in s is achieved”. It may not be in the docs like that, but it is what is expected.
Between set and list, there is a clear distinction between add and append/insertbecause they have different meanings and results due to the positional nature of the list that does not apply to a set. Adding is ambiguous compared to appending for lists, and appending has no meaning for a set.
So why can we not have a different name for a list.discardto sidestep this entire issue? I’m all up for a bunch of bikeshedding as to what would be proper, but even if the implementation is nearly the same, I do not believe that the people using it will have the same expectations of the things it achieves.
To be clear: I completely understand the benefits of this functionality in terms of speed and avoiding the penalty of atry or if statement to accomplish the same thing. I just don’t believe that the argument that ‘it is documented’ is sufficient reason to have a footgun facing you in your code that we can easily avoid. The fact my editor and Python yell at me when I try to discard a list has saved me numerous times from making the mistake that you now argue can be avoided by reading the documentation. I know what the functions do and always have, but easily seeing and confronting my mistakes as opposed to silently letting them happen is a huge gotcha.
I feel the only thing accomplished now is that every discard in a codebase that does not check a return value is going to look like a potential code smell, because lists will need those checks most of the time (did we remove something, yes or no? Did such an entry remain afterwards, yes or no?) while for sets they are pointless.
From where I am standing, list.discardas proposed is looking like it will have tricky edge cases resulting akin to many of the C string library functions (length off by ones) that people will tend to not handle properly (except with leftover entries because they thought the list was a set). The only thing that can make those functions remotely safe is if you have to treat them everywhere equally, but the way to deal with the aftermath ofdiscard will differ depending on the container.
To me, it feels like we are 20 years too late to implement discard on other containers that have wildly different implications on what they factually accomplish. The only container that has ever had it is set, so I think the practical way set.discard has been used and expectations of it are very much the definition of what discard is for.
I’m sorry if I’m too passionate or wordy, by the way! Succinctness is not something I’m good at. 
TL;DR: container.discard has always been safe and predictable, container.remove has always needed attention of some kind… and now we propose to make both of them take pointless brainpower away from the real problems to guard against a new kind of footgun where we mentally apply setexpectations on a list container. Please keep Python simple to reason about.