|
View:
New views
20 Messages
—
Rating Filter:
Alert me
|
| < Prev | 1 - 2 | Next > |
|
|
list comprehension problemHello everyone,
print hosts hosts = [ s.strip() for s in hosts if s is not '' and s is not None and s is not '\n' ] print hosts ['9.156.44.227\n', '9.156.46.34 \n', '\n'] ['9.156.44.227', '9.156.46.34', ''] Why does the hosts list after list comprehension still contain '' in last position? I checked that: print hosts hosts = [ s.strip() for s in hosts if s != '' and s != None and s != '\n' ] print hosts ..works as expected: ['9.156.44.227\n', '9.156.46.34 \n', '\n'] ['9.156.44.227', '9.156.46.34'] Are there two '\n' strings in the interpreter's memory or smth so the identity check "s is not '\n'" does not work as expected? This is weird. I expected that at all times there is only one '\n' string in Python's cache or whatever that all labels meant by the programmer as '\n' string actually point to. Is that wrong assumption? Regards, mk -- http://mail.python.org/mailman/listinfo/python-list |
|
|
Re: list comprehension problemmk wrote:
> Hello everyone, > > print hosts > hosts = [ s.strip() for s in hosts if s is not '' and s is not None > and s is not '\n' ] > print hosts > > ['9.156.44.227\n', '9.156.46.34 \n', '\n'] > ['9.156.44.227', '9.156.46.34', ''] > > Why does the hosts list after list comprehension still contain '' in > last position? > > I checked that: > > print hosts > hosts = [ s.strip() for s in hosts if s != '' and s != None and s != > '\n' ] > print hosts > > ..works as expected: > > ['9.156.44.227\n', '9.156.46.34 \n', '\n'] > ['9.156.44.227', '9.156.46.34'] > > > Are there two '\n' strings in the interpreter's memory or smth so the > identity check "s is not '\n'" does not work as expected? > > This is weird. I expected that at all times there is only one '\n' > string in Python's cache or whatever that all labels meant by the > programmer as '\n' string actually point to. Is that wrong assumption? Clearly. And even if you do figure out what the internals really are doing, it is foolish to write a program that depends on them -- there is no guarantee that such implementation specific behavior will be consistent over other implementations. Conclusion: Don't use "is" for comparison when you mean to check for equality. And you do want an equality check here. Gary Herron > > > > Regards, > mk > -- http://mail.python.org/mailman/listinfo/python-list |
|
|
|
|
|
Re: list comprehension problemOn Oct 29, 9:31 am, "Diez B. Roggisch" <de...@...> wrote:
> mk wrote: > > Hello everyone, > > > print hosts > > hosts = [ s.strip() for s in hosts if s is not '' and s is not None and > > s is not '\n' ] > > print hosts > > > ['9.156.44.227\n', '9.156.46.34 \n', '\n'] > > ['9.156.44.227', '9.156.46.34', ''] > > > Why does the hosts list after list comprehension still contain '' in > > last position? > > > I checked that: > > > print hosts > > hosts = [ s.strip() for s in hosts if s != '' and s != None and s != '\n' > > ] print hosts > > > ..works as expected: > > > ['9.156.44.227\n', '9.156.46.34 \n', '\n'] > > ['9.156.44.227', '9.156.46.34'] > > > Are there two '\n' strings in the interpreter's memory or smth so the > > identity check "s is not '\n'" does not work as expected? > > > This is weird. I expected that at all times there is only one '\n' > > string in Python's cache or whatever that all labels meant by the > > programmer as '\n' string actually point to. Is that wrong assumption? > > Yes. Never use "is" unless you know 100% that you are talking about the same > object, not just equality. > > Diez I'd also recommend trying the following filter, since it is identical to what you're trying to do, and will probably catch some additional edge cases without any additional effort from you. [s.strip() for s in hosts if s.strip()] This will check the results of s.strip(), and since empty strings are considered false, they will not make it into your results. Garrick -- http://mail.python.org/mailman/listinfo/python-list |
|
|
Re: list comprehension problemDiez B. Roggisch wrote:
> mk wrote: > >> Hello everyone, >> >> print hosts >> hosts = [ s.strip() for s in hosts if s is not '' and s is not None and >> s is not '\n' ] >> print hosts >> >> ['9.156.44.227\n', '9.156.46.34 \n', '\n'] >> ['9.156.44.227', '9.156.46.34', ''] >> >> Why does the hosts list after list comprehension still contain '' in >> last position? >> >> I checked that: >> >> print hosts >> hosts = [ s.strip() for s in hosts if s != '' and s != None and s != '\n' >> ] print hosts >> >> ..works as expected: >> >> ['9.156.44.227\n', '9.156.46.34 \n', '\n'] >> ['9.156.44.227', '9.156.46.34'] >> >> >> Are there two '\n' strings in the interpreter's memory or smth so the >> identity check "s is not '\n'" does not work as expected? >> >> This is weird. I expected that at all times there is only one '\n' >> string in Python's cache or whatever that all labels meant by the >> programmer as '\n' string actually point to. Is that wrong assumption? > > Yes. Never use "is" unless you know 100% that you are talking about the same > object, not just equality. > common singleton is None. In virtually every other case you should be using "==" and "!=". -- http://mail.python.org/mailman/listinfo/python-list |
|
|
Re: list comprehension problemFalcolas a écrit :
(snip) > > I'd also recommend trying the following filter, since it is identical > to what you're trying to do, and will probably catch some additional > edge cases without any additional effort from you. > > [s.strip() for s in hosts if s.strip()] The problem with this expression is that it calls str.strip two times... Sometimes, a more lispish approach is better: whatever = filter(None, map(str.strip, hosts)) or just a plain procedural loop: whatever = [] for s in hosts: s = s.strip() if s: whatever.append(s) As far as I'm concerned, I have a clear preference for the first version, but well, YMMV... -- http://mail.python.org/mailman/listinfo/python-list |
|
|
|
|
|
Re: list comprehension problem> Some objects are singletons, ie there's only ever one of them. The most > common singleton is None. In virtually every other case you should be > using "==" and "!=". Please correct me if I am wrong, but I believe you meant to say some objects are immutable, in which case you would be correct. > -- > http://mail.python.org/mailman/listinfo/python-list -- http://mail.python.org/mailman/listinfo/python-list |
|
|
|
|
|
|
|
|
|
|
|
Re: list comprehension problemalex23 wrote:
> On Oct 30, 1:10 pm, Nick Stinemates <n...@...> wrote: >>> Some objects are singletons, ie there's only ever one of them. The most >>> common singleton is None. In virtually every other case you should be >>> using "==" and "!=". >> Please correct me if I am wrong, but I believe you meant to say some >> objects are immutable, in which case you would be correct. > > You're completely wrong. Immutability has nothing to do with identity, > which is what 'is' is testing for: What immutability has to do with identity is that 'two' immutable objects with the same value *may* actually be the same object, *depending on the particular version of a particular implementation*. > >>>> t1 = (1,2,3) # an immutable object >>>> t2 = (1,2,3) # another immutable object Whether or not this is 'another' object or the same object is irrelevant for all purposes except identity checking. It is completely up to the interpreter. >>>> t1 is t2 > False In this case, but it could have been True. >>>> t1 == t2 > True > > MRAB was refering to the singleton pattern[1], of which None is the > predominant example in Python. None is _always_ None, as it's always > the same object. And in 3.x, the same is true of True and False. -- http://mail.python.org/mailman/listinfo/python-list |
|
|
|
|
|
Re: list comprehension problemalex23 wrote:
> Terry Reedy <tjre...@...> wrote: >> alex23 wrote: >>> You're completely wrong. Immutability has nothing to do with identity, ... > I'm honestly not getting your point here. Let me try again, a bit differently. I claim that the second statement, and therefor the first, can be seen as wrong. I also claim that (Python) programmers need to understand why. In mathematics, we generally have immutable values whose 'identity' is their value. There is, for example, only one, immutable, empty set. In informatics, and in particular in Python, in order to have mutability, we have objects with value and an identity that is separate from their value. There can be, for example, multiple mutable empty sets. Identity is important because we must care about which empty set we add things to. 'Identity' is only needed because of 'mutability', so it is mistaken to say they have nothing to do with each other. Ideally, from both a conceptual and space efficiency view, an implementation would allow only one copy for each value of immutable classes. This is what new programmers assume when they blithely use 'is' instead of '==' (as would usually be correct in math). However, for time efficiency reasons, there is no unique copy guarantee, so one must use '==' instead of 'is', except in those few cases where there is a unique copy guarantee, either by the language spec or by one's own design, when one must use 'is' and not '=='. Here 'must' means 'must to be generally assured of program correctness as intended'. We obviously agree on this guideline. Terry Jan Reedy -- http://mail.python.org/mailman/listinfo/python-list |
|
|
|
|
|
Re: list comprehension problem> .... > There are an infinite number of empty sets > that differ according to their construction: > .... > The set of all fire-breathing mammals. > .... Apparently, you have never been a witness to someone who recently ingested one of Cousin Chuy's Super-Burritos .......... :-) -- Stanley C. Kitching Human Being Phoenix, Arizona -- http://mail.python.org/mailman/listinfo/python-list |
|
|
Re: list comprehension problemSteven D'Aprano wrote:
> (6) Metaphoric equivalence: > Kali is death. > Life is like a box of chocolates. OK to here, but this one switches between metaphor and simile, and arguably, between identity and equality. Mel. -- http://mail.python.org/mailman/listinfo/python-list |
|
|
Re: list comprehension problemSteven D'Aprano wrote:
> There are an infinite number of empty sets that differ according to their > construction: > > The set of all American Presidents called Boris Nogoodnik. > The set of all human languages with exactly one noun and one verb. > The set of all fire-breathing mammals. > The set of all real numbers equal to sqrt(-1). > The set of all even prime numbers other than 2. > The set of all integers between 0 and 1 exclusive. > The set of all integers between 1 and 2 exclusive. > The set of all positive integers between 2/5 and 4/5. > The set of all multiples of five between 26 and 29. > The set of all non-zero circles in Euclidean geometry where the radius > equals the circumference. > ... Logically, they're all the same, by extensionality. There is of course a difference between the reference of an expression and it's meaning, but logical truth only depends on reference. In mathematical logic 'the thing, that ...' can be expressed with the iota operator (i...), defined like this: ((ia)phi e b) := (Ec)((c e b) & (Aa)((a = b) <-> phi)). with phi being a formula, E and A the existential and universal quantors, resp., e the membership relation, & the conjunction operator and <-> the bi-conditional operator. When we want find out if two sets s1 and s2 are the same we only need to look at their extensions, so given: (i s1)(Ay)(y e s1 <-> y is a fire-breathing animal) (i s2)(Ay)(y e s2 <-> y is a real number equal to sqrt(-1)) we only need to find out if: (Ax)(x is a fire-breathing animal <-> x is a real number equal to sqrt(-1)). And since there are neither such things, it follows that s1 = s2. BTW, '=' is usually defined as: a = b := (AabP)(Pa <-> Pb) AKA the Leibniz-Principle, but this definition is 2nd order logic. If we have sets at our disposal when we're axiomatisizing mathematics, we can also define it 1st-orderly: a = b := (Aabc)((a e c) <-> (b e c)) Regargs, Mick. -- http://mail.python.org/mailman/listinfo/python-list |
|
|
Re: list comprehension problemOn Sun, 01 Nov 2009 21:32:15 +0100, Mick Krippendorf wrote:
> When we want find out if two sets s1 and s2 are the same we only need to > look at their extensions, so given: > > (i s1)(Ay)(y e s1 <-> y is a fire-breathing animal) (i s2)(Ay)(y e s2 > <-> y is a real number equal to sqrt(-1)) > > we only need to find out if: > > (Ax)(x is a fire-breathing animal <-> x is a real number equal to > sqrt(-1)). > > And since there are neither such things, it follows that s1 = s2. That assumes that all({}) is defined as true. That is a common definition (Python uses it), it is what classical logic uses, and it often leads to the "obvious" behaviour you want, but there is no a priori reason to accept that all({}) is true, and indeed it leads to some difficulties: All invisible men are alive. All invisible men are dead. are both true. Consequently, not all logic systems accept vacuous truths. http://en.wikipedia.org/wiki/Vacuous_truth -- Steven -- http://mail.python.org/mailman/listinfo/python-list |
|
|
Re: list comprehension problemSteven D'Aprano wrote:
> On Sun, 01 Nov 2009 21:32:15 +0100, Mick Krippendorf wrote: >> >> (Ax)(x is a fire-breathing animal <-> x is a real number equal to >> sqrt(-1)). >> >> And since there are neither such things, it follows that s1 = s2. > > That assumes that all({}) is defined as true. That is a common definition > (Python uses it), it is what classical logic uses, and it often leads to > the "obvious" behaviour you want, but there is no a priori reason to > accept that all({}) is true, and indeed it leads to some difficulties: > > All invisible men are alive. > All invisible men are dead. > > are both true. Consequently, not all logic systems accept vacuous truths. > > http://en.wikipedia.org/wiki/Vacuous_truth You're right, of course, but I'm an oldfashioned quinean guy :-) Also, in relevance logic and similar systems my beloved proof that there are no facts (Davidson's Slingshot) goes down the drain. So I think I'll stay with classical logic FTTB. Regards, Mick. -- http://mail.python.org/mailman/listinfo/python-list |
| < Prev | 1 - 2 | Next > |
| Free embeddable forum powered by Nabble | Forum Help |