当前位置:  开发笔记 > 编程语言 > 正文

在Python中搜索对象列表

如何解决《在Python中搜索对象列表》经验,为你挑选了6个好方法。

让我们假设我正在创建一个类似于C风格结构的简单类,只保存数据元素.我试图弄清楚如何搜索对象列表中具有等于某个值的属性的对象.下面是一个简单的例子来说明我正在尝试做什么.

例如:

class Data:
    pass

myList = []

for i in range(20):
    data = Data()
    data.n = i
    data.n_squared = i * i
    myList.append(data)

我如何搜索myList列表以确定它是否包含n == 5的元素?

我一直在谷歌搜索并搜索Python文档,我想我可以用列表理解来做到这一点,但我不确定.我可能会补充一点,我必须使用Python 2.4.3,所以任何新的gee-whiz 2.6或3.x功能都无法使用.



1> Adam Rosenfi..:

您可以使用列表推导获得所有匹配元素的列表:

[x for x in myList if x.n == 30]  # list of all elements with .n==30

如果您只想确定列表是否包含匹配的任何元素并且(相对)有效地执行它,您可以这样做

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


或者,任何(myList中的x的custom_filter(x),如果xn == 30),这只是你的"包含"函数作为内置函数.

2> gahooa..:

简单,优雅,强大:

生成器表达式与内置...(python 2.5+)

any(x for x in mylist if x.n == 10)

使用Python any()内置,定义如下:

any(iterable) -> 如果iterable的任何元素为true,则返回True.相当于:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False



3> Charlie Mart..:

为了完整,让我们不要忘记可能有效的最简单的事情:

for i in list:
  if i.n == 5:
     # do something with it
     print "YAY! Found one!"



4> Markus Jarde..:
[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



5> vartec..:
filter(lambda x: x.n == 5, myList)


对于想要学习Python的人来说,理解lambda是基本的.
嗯,是的和没有 - 使用列表推导和排序关键函数制造商,如operator.attrgetter,我几乎没有使用`lambda`s.

6> Tom Dunham..:

您可以使用in寻找一个集合中的一个项目,一个列表解析来提取你感兴趣的领域.这(适用于列表,集合,元组和任何定义__contains____getitem__).

if 5 in [data.n for data in myList]:
    print "Found it"

也可以看看:

包含方法

在运作中

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有