检查对象是否在列表中

你好,
我想测试对象是否在列表中(身份而不是平等
测试).
如果当然可以写这样的话:
测试= false
myObject = mycustomclass(*args,** kw)
对于myList中的元素:
如果元素是myObject:
测试= true
休息
而且我什至可以编写ISINLIST(ELT,myList)函数.
但是大多数时候,当我需要Python的一些基本功能时,我
稍后发现它实际上已经实施. ;-)
那么,Python中是否已经有类似的东西?
我试图写:
"元素在myList中"
但这似乎是错误的语法...
所有涉及的对象都有一个" __eq__"方法.
谢谢,
N. P.
PS:顺便说一句,如何实现集合元素比较?我的第一次
印象是" A"和" B"成员在和
只有哈希(a)==哈希(b),但我显然错了:
.... def __eq __(self,y):
....返回false
.... def __hash __(自我):
....返回5
...
错误的
真的
错误的
设置([[<__ main __.at 0xb7a91dac>])
因此,也有一些平等检查,也许只有" __eq__"是
实施的 ?

# 回答1

nihige*************@gmail.com写道:
Python中没有" IS"操作员,但是您可以编写更多测试
简洁地
任何(myObject是myList中元素的元素)
... def __eq __(self,y):
...返回false
... def __hash __(自我):
...返回5
...
错误的
真的
错误的
设置([[<__ main __.at 0xb7a91dac>])
因此,也有一些平等检查,也许只有" __eq__"是
实施的 ?
一般而言,平等由__eq __()或__cmp __()确定.默认
对象平等检查身份.
一些容器(例如内置集和dict)假设A == B表示
哈希(a)==哈希(b).
彼得
# 回答2


在18 Juil,11:30,Peter Otten <__ Pete ...@web.dewrote:
Python中没有" IS"操作员,但是您可以编写更多测试
简洁地
任何(myObject是myList中元素的元素)
非常感谢
但是,仅当Python版本> = 2.5时,任何()才可用
如果Python版本<2.5,可以在初始化上定义任何()函数
我认为像
也可以正常工作,也不太可读,也许不是那么快
(?)...
一个" ins in"运营商会很好...
... def __eq __(self,y):
...返回false
... def __hash __(自我):
...返回5
...
错误的
真的
错误的
设置([[<__ main __.at 0xb7a91dac>])

一般而言,平等由__eq __()或__cmp __()确定.默认
对象平等检查身份.
一些容器(例如内置集和dict)假设A == B表示
哈希(a)==哈希(b).
彼得
因此,确切地说,您的意思是,如果哈希(a)!= hash(b),a和b为
被认为是不同的,否则[即.如果哈希(a)==哈希(b)],则a和b为
当且仅当a == b时相同?

# 回答3


实际上,"任何(myObject是myList中的元素是元素)是2次
比使用循环慢, 和'id(myObject)在(id(element)的
myList中的元素)'速度慢2.4倍.
# 回答4

nihige*************@gmail.com写道:
也可以正常工作,也不太可读,也许不是那么快
(?)...
一个" ins in"运营商会很好...
而且很少使用.甚至可能小于(也缺少)
操作员...
正确设置,dict.对于列表等.哈希没关系:
.... def __hash __(自我):
....返回nexthash()
.... def __eq __(自我,其他):
....返回true
...
真的
错误的
彼得
# 回答5


除非您至少有资格参加
实际检查的项目数.对于足够长的序列
任何()和f​​or循环都在这里花费大致相同的时间.
$ python -m timeit -s"项目= range(1000); x = 1000""任何(x是项目的项目)
在项目中)"
1000循环,最佳3:249 USEC每循环
$ python -m timeit -s"项目= range(1000); x = 1000" for项目中的项目:""
如果x是项目:休息"
1000循环,最佳3:276 USEC每循环
$ python -m timeit -s"项目= range(1000); x = 0""任何(x是项目中的项目
项目)"
100000循环,最佳3:3每循环USEC
$ python -m timeit -s" items = range(1000); x = 0" for项目中的项目:"如果x
是项目:休息"
1000000循环,最佳3:0.317 USEC每循环
彼得
PS:用一粒盐来取这些数字,它们之间的差异很大.
# 回答6


在18 Juil,12:26,Peter Otten <__ Pete ...@web.dewrote:
也可以正常工作,也不太可读,也许不是那么快
(?)...

而且很少使用.甚至可能小于(也缺少)
操作员...
也许,但是恕我直言

不是.

# 回答7


在18岁的Juil,13:13上,Peter Otten <__ Pete ...@web.dewrote:
除非您至少有资格参加
实际检查的项目数.对于足够长的序列
任何()和f​​or循环都在这里花费大致相同的时间.
对不起.我使用了简短的列表(列表20浮子)和元素
检查不在列表中.
(我通常会在代码中处理这种情况.)
# 回答8

ni@_)ni@_@gmail.com写道:除非您在最少有资格使用实际检查的项目.对于任何()和循环的序列较长,循环大致相同的时间.
对不起.我使用了简短的列表(列表20浮子)和元素
检查不在列表中.
(我通常在代码中处理这种情况.)
顺便说一下,您的(具体)用例是什么?
如果您想要效率,则应使用词典而不是列表
反正:
$ python -m timeit -s d = dict((id(i),i)for rang(1000)); x =
1000"" id(x)在D中
1000000循环,最佳3:0.275 USEC每循环
彼得
# 回答9


彼得·奥特:
另一个可能性:-)
从Itertools导入IMAP
iD(x)中的IMAP(ID,项目)
我 GREE,但有时您需要寻找的物品,因此要建立
整个dict(也需要记忆也需要记忆)可能是浪费时间.
从理论上讲,这可能更快地建造,但实际上您需要一个
基准:
ids = set(imap(id,项目))
其次是:
ID中的ID(X)
再见,
# 回答10


顺便说一下,您的(具体)用例是什么?
我尝试使其简单(几乎有25000行代码...)
我有一个带有几何对象的纸(点,线,多边形,
ETC.)
该表有一个对象管理器.
因此,简化:
然后我们有:
真的
由于有和B具有相同的坐标.
但是,当然A和B对象不是相同的Python对象.
在某些情况下,某些几何对象自动是
在表中引用,而无需用户定义.
(例如,多边形的边缘...)
但是不得两次引用它们.因此,如果多边形的边缘
已经引用(因为多边形使用已经引用的
其构造的对象...),不得再次引用它.
但是,如果有一个物体,那是不小心具有相同的对象
坐标,必须用不同的名称引用它.
因此,我在'sheet.objects .__ setattr __(self,
名称,值)':
如果类型(value)==多边形:
对于value.edges的边缘:
如果edge is_in sheet.objects .__ dict __.itervalues():
object .__ setAttr __(self,self .__ new_name(),边缘)
好的,我想这很困惑,但是很难总结. ;-)
我不知道Itertools.
谢谢 :-)
# 回答11


2008年7月18日星期五07:39:38 -0700,尼古拉斯(Nicolas).
您正在设置具有计算名称的属性吗?您如何访问它们?
始终使用`getTattr()或通过'__dict__'?如果答案是肯定的,为什么
您不是把物体放入字典中而不是额外
重定向对象`___dict__"?
哦,type()`测试闻起来就像您正在实施多态性
在某种程度上应该用OOP技术代替.
再见,
marc'blackjack'rintsch
# 回答12


我尝试使其简单(几乎有25000行代码...)
我有一个带有几何对象的纸(点,线,多边形,
ETC.)
该表有一个对象管理器.
因此,简化:
然后我们有:
真的
由于有和B具有相同的坐标.
但是,当然A和B对象不是相同的Python对象.
在某些情况下,某些几何对象自动是
在表中引用,而无需用户定义.
(例如,多边形的边缘...)
但是不得两次引用它们.因此,如果多边形的边缘
已经引用(因为多边形使用已经引用的
其构造的对象...),不得再次引用它.
但是,如果有一个物体,那是不小心具有相同的对象
坐标,必须用不同的名称引用它.
因此,我在'sheet.objects .__ setattr __(self,
名称,值)':
如果类型(value)==多边形:
对于value.edges的边缘:
如果Edge IS_IN表. 对象.__ dict __.itervalues():
object .__ setAttr __(self,self .__ new_name(),边缘)
好的,我想这很困惑,但是很难总结. ;-)
我不会假装我理解;)
如果您使点变不到
引用两次"要求.
彼得
# 回答13


彼得·奥滕写道:
正确设置,dict.对于列表等.哈希没关系:
由于cpython将字符串哈希作为字符串对象的一部分(最后一个i)保存
阅读,作为内部字符串缓存的一部分),它做类似的操作.
比较长度,然后比较哈希,然后比较c阵列.
# 回答14


在18 Juil,17:52,Marc'Blackjack'Rintsch 您正在设置具有计算名称的属性吗? *您如何访问它们?
始终使用`getTattr()或通过'__dict__'? *如果答案是肯定的,为什么
您不是把物体放入字典中而不是额外
重定向对象`___dict__"?
是的,我可能会尺寸为dict,并更改其__getItem__和__setitem___________________________
方法,而不是更改objets __setattr __和__getAttr __...但是
我更喜欢

我在这里错误地写了"类型",但我在我的
代码. ;-)
引用两次"要求.
是的,但不幸的是我不能(或者需要完整
重新设计...)
# 回答15


尼古拉斯(Nicolas).
是的,我可能会尺寸为dict,并更改其__getItem__和__setitem___________________________
方法,而不是更改objets __setattr __和__getAttr __...但是
我更喜欢

哦,type()`测试闻起来就像您正在实施多态性
在某种程度上应该用OOP技术代替.

我在这里错误地写了"类型",但我在我的
代码. ;-)
引用两次"要求.
是的,但不幸的是我不能(或者需要完整
重新设计...)
(1)您正在搜索列表以通过身份找到浮动对象,
不按价值
(2)彼得说他不明白
(3)马克认为它闻起来
IOW,迹象表明它已经 *已经 *需要完全重新设计.

# 回答16


在星期六,2008年7月19日13:13:40 -0700,Nicolas.pourcelot写道:您正在设置具有计算名称的属性吗? `*您如何访问它们?始终使用`getTattr()或通过'__dict__''? Â*If the answer is yes, whydon't you put the objects the into a dictionary instead of the extraredirection of an objects `__dict__`?
是的,我可能会尺寸为dict,并更改其__getItem__和__setitem___________________________
方法,而不是更改objets __setattr __和__getAttr __...但是
我更喜欢

但是使用计算的名称并不是更像
setAttr(Sheet.Objects,名称,点(0,0))
VS.
sheet.Objects [name] = point(0,0)

getAttr(Sheet.Objects,名称)
VS.
表格[名称]
还是您的代码中确实有``sheet.objects.a'
存在一个名为" A"的属性?
我在这里错误地写了"类型",但是我在代码中使用了" IsInstance". ;-)
不会改变"代码气味". OOP方法将是一种方法
GE 知道该怎么做的删除对象,而不是类型测试来决定
如何处理每种类型的几何对象.
再见,
marc'blackjack'rintsch
# 回答17


????
# 回答18


尼古拉斯(Nicolas).
????
你写了 """
我使用了简短的列表(列表20浮子)和元素
检查不在列表中.
(我通常在代码中处理这种情况.)
""
# 回答19


约翰·马基(John Machin
你写了 """
我使用了简短的列表(列表20浮子)和元素
检查不在列表中.
(我通常在代码中处理这种情况.)
"""
:d
# 回答20


在20 Juil,07:17,Marc'blackjack'Rintsch
但是使用计算的名称并不是更像
setAttr(Sheet.Objects,名称,点(0,0))
VS.
sheet.Objects [name] = point(0,0)

getAttr(Sheet.Objects,名称)
VS.
表格[名称]
还是您的代码中确实有``sheet.objects.a'
存在一个名为" A"的属性?
不会改变"代码气味". *OOP方法将是一种方法
知道该怎么做的几何对象而不是类型测试来决定
如何处理每种类型的几何对象.
再见,
* * * * MARC'二十一点'Rintsch
谢谢您的建议,拥有外部非常有趣
观点看法.
不,我在库代码中没有类似的" sheet.objects.a"
但是我然后在不同的程序中使用图书馆
sheet.Objects.有时会发生.
但是,由于它不是那么频繁,所以我确实可以统计,并且
更改__getItem__,__setitem__和__delitem__,然后重定向
__getAttr __,__setattr __,__delattr__ to以前的方法...
不会破坏库外的API,并且可能会加快一点
内部内容.
我不是OOP的专家;恕我直言,这在很大程度上是卑鄙的,而不是目标.
一方面,"知道该怎么做的几何对象的方法"
将要求他们包含有关对象的一些代码
经理...我不太喜欢.另一方面,对象
经理不应依靠对象的实现...我会认为
关于那个.
谢谢大家的回答.
对不起,我可能没有时间进一步回复,这很有趣:-)
(即使我对我很难用英语清楚写;-)(_@_ _)

标签: python

添加新评论