【问题标题】:Python filter() object list with variablesPython filter() 带有变量的对象列表
【发布时间】:2019-12-24 21:48:41
【问题描述】:

我有一个通用问题,我一直在用 python 使用列表理解,但我遇到了 filter(),你可以在其中传递一个定义的函数来过滤对象列表。

filteredList = filter(filterfunction, listOfItemsToFilter)

是否也可以传入您要测试的属性?

class testObject(object):
    def __init__(self, att1="", att2="", att3=""):
        self.att1 = att1
        self.att2 = att2
        self.att3 = att3

def t_filter_function(item):
    if item.att2 == 'item 2':
        return True
    else:
        return False

def printer(list):
    for item in list:
        print(item.att1, item.att2, item.att2)

def main():
    testObjectList = []
    testObjectList.append(testObject(att1='1', att2='item 1', att3='a'))
    testObjectList.append(testObject(att1='2', att2='item 2', att3='b'))
    testObjectList.append(testObject(att1='3', att2='item 2', att3='c'))

    printList = filter(t_filter_function, testObjectList)

    printer(printList)

main()

我想做的是扩展函数 t_filter_function() 以便我可以传入一个变量,这样我就可以测试 att2 的任何值,

printList = filter(t_filter_function('item 2', testObjectList), testObjectList)

【问题讨论】:

    标签: python python-3.x filter


    【解决方案1】:

    您可以修改您的t_filter_function 以获取一个附加参数,该参数将是您要测试的属性值:

    def t_filter_function(item,attr):
        if item.att2 == attr:
            return True
        else:
            return False
    

    然后你可以修改你的filter函数:

    printList = filter(lambda elem: t_filter_function(elem,'item 2'), testObjectList)
    

    【讨论】:

      【解决方案2】:

      有几个选项。您可以创建一个新函数,该函数接受一个列表和一个目标,并过滤出与该目标匹配的项目:

       def filter_to_target(target,starting_list):
           return filter(lambda x: x == target, starting_list)
      

      您可以创建一个函数,该函数返回一个检查目标是否相等的函数,然后在filter 中使用它:

      def get_filter_function(target):
          return lambda x: x == target
      
      filter(get_filter_function(target),starting_list)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-16
        • 1970-01-01
        • 1970-01-01
        • 2020-01-23
        相关资源
        最近更新 更多