0

我有一个 MC 实例列表,我想对属性等于 2 的所有实例进行子集化。你能帮我创建函数“超级函数”,它根据接受或拒绝的值执行子集。

class MC(object):
     def __init__(self,smth):
         self.smth=smth

l = [MC(2),MC(4),MC(1),MC(2),MC(2),MC(-3),MC(0)]

def superfunction (a_list,attr,value_to_accept=None, value_to_reject=None):
     return a_subset

它如何用于字典?

非常感谢 !

4

3 回答 3

1

对于您的具体示例,您可以使用如下列表理解:

return [x for x in a_list if x.smth == 2]

对于您的一般示例,您可以执行类似的操作:

if value_to_accept is not None:
    return [x for x in a_list if x.smth == value_to_accept]
if value_to_reject is not None:
    return [x for x in a_list if x.smth != value_to_reject]
return []
于 2013-07-30T14:42:49.010 回答
1

您不一定需要单独的函数来执行此操作。列表推导非常简单:

[mc from l if mc.smth == value_to_accept]
[mc from l if mc.smth != value_to_reject]
于 2013-07-30T14:43:35.327 回答
1

您可以使用filter()谓词:

def superfunction (a_list, attr, value_to_accept=None, value_to_reject=None):
    def predicate(item):
        value = getattr(item, attr)
        if value_to_reject is not None and value != value_to_reject:
            return False
        if value_to_accept is not None and value == value_to_accept:
            return True
        return False

   return filter(predicate, a_list)

这让您可以指定要接受或拒绝的值。

但是,通常您会使用内联列表推导而不是函数:

[elem for elem in a_list if a_list.attr == value_to_accept]
于 2013-07-30T14:46:04.273 回答