473,394 Members | 1,715 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,394 software developers and data experts.

difference between `x in list` and `list.index(x)` for instances of anew-style class


Hello,

I have some code that stops when trying to find a graph in a list of
similar graphs::

(Pydb) list
110 try:
111 canonical = self.base[self.base.index(graph)]
112 except ValueError:
113 raise ValueError, \
114 "Cannot find canonical representative for graph `%s`." \
115 - % (repr(graph),)
116
....

The list `self.base` contains "canonical" forms of the graphs and the
`graph` object must compare equal to some item of the list, which
indeed it does::

(Pydb) p graph == self.base[27]
True

(Pydb) p graph in self.base
True

However, I cannot directly get the index of the canonical graph (the
number "27" above was found by manual inspection)::

(Pydb) self.base.index(graph)
*** ValueError: list.index(x): x not in list

All graphs are instances of a `Graph` new-style class that implements
comparison operators `__eq__` and `__ne__`, but no other rich-compare
stuff.

I'm using Python 2.5::

Python 2.5 (release25-maint, Dec 9 2006, 16:17:58)
[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-20)] on linux2

So my question is: what are the implementation differences between `x
in list` and `list.index(x)` and why can one report that an item is in
the list while the other cannot find its index? Should I add
something to the `Graph` class so that `index` works?

Thanks for any hint!
--
Riccardo Murri, via Galeazzo Alessi 61, 00176 Roma

Dec 29 '07 #1
3 2401
On 28 dic, 20:12, Riccardo Murri <riccardo.mu...@gmail.comwrote:
The list `self.base` contains "canonical" forms of the graphs and the
`graph` object must compare equal to some item of the list, which
indeed it does::

* (Pydb) p graph == self.base[27] *
* True

* (Pydb) p graph in self.base
* True

However, I cannot directly get the index of the canonical graph (the
number "27" above was found by manual inspection)::

* (Pydb) self.base.index(graph)
* *** ValueError: list.index(x): x not in list

All graphs are instances of a `Graph` new-style class that implements
comparison operators `__eq__` and `__ne__`, but no other rich-compare
stuff.

I'm using Python 2.5::

* Python 2.5 (release25-maint, Dec *9 2006, 16:17:58)
* [GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-20)] on linux2

So my question is: what are the implementation differences between `x
in list` and `list.index(x)` and why can one report that an item is in
the list while the other cannot find its index? *Should I add
something to the `Graph` class so that `index` works?
(I've checked on 2.5.1 but I don't see any relevant differences with
the 2.5 version). Looking at the source for both methods, they only
use the __eq__ operator, but there is a slight difference: while one
evaluates list[i]==x, the other reverses the operands. If your __eq__
is not reflexive, that could explain the difference.

class Graph(object):
def __init__(self, *items):
self.items = items

def __eq__(self, other):
if len(self.items)>len(other.items): return False
return self.items == other.items[:len(self.items)]

pyList = [Graph(1,2,3), Graph(4,5,6), Graph(1,2,3,4)]
pyg = Graph(1,2)
pyg in List
True
pyList.index(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.index(x): x not in list
pyList[0]==g
False
pyg==List[0]
True

In your example, see if self.base[27]==graph is still True.

--
Gabriel Genellina
Dec 29 '07 #2
bp*******@gmail.com writes:
On 28 dic, 20:12, Riccardo Murri <riccardo.mu...@gmail.comwrote:
>The list `self.base` contains "canonical" forms of the graphs and the
`graph` object must compare equal to some item of the list, which
indeed it does::

Â* (Pydb) p graph == self.base[27] Â*
Â* True

Â* (Pydb) p graph in self.base
Â* True

However, I cannot directly get the index of the canonical graph (the
number "27" above was found by manual inspection)::

Â* (Pydb) self.base.index(graph)
Â* *** ValueError: list.index(x): x not in list

All graphs are instances of a `Graph` new-style class that implements
comparison operators `__eq__` and `__ne__`, but no other rich-compare
stuff.

I'm using Python 2.5::

Â* Python 2.5 (release25-maint, Dec Â*9 2006, 16:17:58)
Â* [GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-20)] on linux2

So my question is: what are the implementation differences between `x
in list` and `list.index(x)` and why can one report that an item is in
the list while the other cannot find its index? Â*Should I add
something to the `Graph` class so that `index` works?

(I've checked on 2.5.1 but I don't see any relevant differences with
the 2.5 version). Looking at the source for both methods, they only
use the __eq__ operator, but there is a slight difference: while one
evaluates list[i]==x, the other reverses the operands. If your __eq__
is not reflexive, that could explain the difference.
That was indeed the reason: a bug in Graph.__eq__ broke reflexivity in
certain cases.

Thank you very much!!

--
Riccardo Murri, via Galeazzo Alessi 61, 00176 Roma

Dec 30 '07 #3
On 30 dic, 06:24, Riccardo Murri <riccardo.mu...@gmail.comwrote:
bpgbai...@gmail.com writes:
* (Pydb) p graph == self.base[27] *
* True
* (Pydb) p graph in self.base
* True
* (Pydb) self.base.index(graph)
* *** ValueError: list.index(x): x not in list
Looking at the source for both methods, they only
use the __eq__ operator, but there is a slight difference: while one
evaluates list[i]==x, the other reverses the operands. If your __eq__
is not reflexive, that could explain the difference.

That was indeed the reason: a bug in Graph.__eq__ broke reflexivity in
certain cases.
Combined with some other WTF bugs I've found at work, lately I feel
more like a detective than a software developer :)

--
Gabriel Genellina
Dec 30 '07 #4

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

33
by: Jim Cobban | last post by:
I cannot get Netscape 4.79 to properly display the ordered list in the following fragment. <P>Get a specific portion of the date. Depending upon the value of index: <ol start=0> <li>complete...
12
by: Aaron Prohaska | last post by:
I have been trying to figure out how to make the property values of two instances of the same control synchronize during a postback and need some help. I have posted an example of what I'm trying...
4
by: techiepundit | last post by:
I'm a Python newbie who just started learning the language a few weeks ago. So these are beginner questions. I have a list of sockets that I use for select.select calls like this: ...
3
by: Varangian | last post by:
Hello, there I have a problem with regards to System.Collections.Generic.List<T> I need to pass a class with implements an interface - TestClass : IPerson I put this class in a...
18
by: Daniel | last post by:
My previous thread got very large so here is my point again, but a better example of my problem: SceneChair chair = (SceneChair)_objMan.GetObject((int)ObjectID.Seats); chair.Position =...
0
by: mel_apiso | last post by:
Hi, after uncatalog one database, and catalog again with other name, if I try to connect with this database, everything is ok, but list applications only show me the connection with the...
35
by: erikwickstrom | last post by:
Hi all, I'm sorry about the newbie question, but I've been searching all afternoon and can't find the answer! I'm trying to get this bit of code to work without triggering the IndexError. ...
6
by: Savante | last post by:
I have been writing a datalogging application. It reads in double's into a database. I want to be able to click on a row in a database (holds name of variable and also current value of variable)...
2
theaybaras
by: theaybaras | last post by:
Hi all, I have a table and a subtable . CAssessments is a combobox that looks up a table called AssessList has 2 columns, an autonumber PK and a string for the title of the Assessment. ...
14
by: puzzlecracker | last post by:
I noticed in my code, which is essentially an api for the client, that I return ArrayList object to the client. In my case, list consist of some objects that user only need to iterate over, hence...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.