让我们假设我正在创建一个类似于C风格结构的简单类,只保存数据元素.我试图弄清楚如何搜索对象列表中具有等于某个值的属性的对象.下面是一个简单的例子来说明我正在尝试做什么.
例如:
class Data:
pass
myList = []
for i in range(20):
data = Data()
data.n = i
data.n_squared = i * i
myList.append(data)
Run Code Online (Sandbox Code Playgroud)
我如何搜索myList列表以确定它是否包含n == 5的元素?
我一直在谷歌搜索并搜索Python文档,我想我可以用列表理解来做到这一点,但我不确定.我可能会补充一点,我必须使用Python 2.4.3,所以任何新的gee-whiz 2.6或3.x功能都无法使用.
Ada*_*eld 111
您可以使用列表推导获得所有匹配元素的列表:
[x for x in myList if x.n == 30] # list of all elements with .n==30
Run Code Online (Sandbox Code Playgroud)
如果您只想确定列表是否包含匹配的任何元素并且(相对)有效地执行它,您可以这样做
def contains(list, filter):
for x in list:
if filter(x):
return True
return False
if contains(myList, lambda x: x.n == 3) # True if any element has .n==3
# do stuff
Run Code Online (Sandbox Code Playgroud)
gah*_*ooa 66
简单,优雅,强大:
生成器表达式与内置...(python 2.5+)
any(x for x in mylist if x.n == 10)
Run Code Online (Sandbox Code Playgroud)
使用Python any()
内置,定义如下:
any(iterable)
->
如果iterable的任何元素为true,则返回True.相当于:
def any(iterable):
for element in iterable:
if element:
return True
return False
Run Code Online (Sandbox Code Playgroud)
Cha*_*tin 42
为了完整,让我们不要忘记可能有效的最简单的事情:
for i in list:
if i.n == 5:
# do something with it
print "YAY! Found one!"
Run Code Online (Sandbox Code Playgroud)
Mar*_*rot 32
[x for x in myList if x.n == 30] # list of all matches
[x.n_squared for x in myList if x.n == 30] # property of matches
any(x.n == 30 for x in myList) # if there is any matches
[i for i,x in enumerate(myList) if x.n == 30] # indices of all matches
def first(iterable, default=None):
for item in iterable:
return item
return default
first(x for x in myList if x.n == 30) # the first match, if any
Run Code Online (Sandbox Code Playgroud)
var*_*tec 27
filter(lambda x: x.n == 5, myList)
Run Code Online (Sandbox Code Playgroud)
小智 12
另一种方法是使用 next() 函数。
matched_obj = next(x for x in list if x.n == 10)
Run Code Online (Sandbox Code Playgroud)
您可以使用in
寻找一个集合中的一个项目,一个列表解析来提取你感兴趣的领域.这(适用于列表,集合,元组和任何定义__contains__
或__getitem__
).
if 5 in [data.n for data in myList]:
print "Found it"
Run Code Online (Sandbox Code Playgroud)
也可以看看:
你应该在你的类中添加一个__eq__
和一个__hash__
方法Data
,它可以检查__dict__
属性是否相等(相同的属性),然后它们的值是否也相等。
如果你这样做了,你可以使用
test = Data()
test.n = 5
found = test in myList
Run Code Online (Sandbox Code Playgroud)
该in
关键字检查是否test
是myList
。
如果您只想拥有一个n
属性,Data
您可以使用:
class Data(object):
__slots__ = ['n']
def __init__(self, n):
self.n = n
def __eq__(self, other):
if not isinstance(other, Data):
return False
if self.n != other.n:
return False
return True
def __hash__(self):
return self.n
myList = [ Data(1), Data(2), Data(3) ]
Data(2) in myList #==> True
Data(5) in myList #==> False
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
122948 次 |
最近记录: |