python过滤组合列表

时间:2015-03-16 01:50:09

标签: python list python-2.7 dictionary

我有一个非常独特的问题,我一直绞尽脑汁试图找出一个简洁而实用的解决方案。任何帮助都会非常感激。

我正在尝试过滤字典元组列表。我知道这听起来很复杂,但我保证这很有道理。

为了可视化,每个内部字典代表一种类型的球。我有4个盒子。每个都包含一个球。一组4个盒子由长度为4的元组表示。我必须在一组4个盒子中找到每个独特的球组合。所以,如果我有6个球,我有4 ^ 6个独特的组合,因此在列表中有元组。在使用itertools之后,我有了这个组合列表(元组列表)和不同的球组合(字典)。现在我有了这个独特组合的史诗列表,我需要过滤掉我想要处理的组合。我想过滤掉只有一个球的组合(元组),例如框1中的'type1'(元组索引1)和框3中的类型0。结果将是字典元组列表,或某些类型的球在某些框中的组合列表。

对于上面的示例,我看到输入的最佳方式是字典,例如{1:'type1',3:'type3'}。当然,输入字典最多是{1:_,2:_,3:_,4:_}。如果有人对如何通过这些过滤器选项提出其他建议,我会非常乐意接受建议。

我正在设想一个带有AND函数的lambda函数的列表理解吗?但是,似乎无法使任何工作。

有些人是具有列表/字典理解的向导,并且匹配内部函数以在简洁的功能行中获得您想要的内容。如果您回答这个问题,请告诉我它是如何工作的以及它的工作原理。试图从大脑信任中学习。

到目前为止我所拥有的:

def config_filter(allConfigs,filterOptions,fieldName):
    # fieldName: a string which is the key to the dictionary being looked. In 
    # examples this would be 'type'

    # because the filter options could have any of 1 through 4 options, a list
    # of keys are made. 
    keys = list(filterOptions.keys())

    def zero(): #return unfiltered allConfigs if no options are given
        return allConfigs
    def one():  # use the first key to filter through list items
        return [d for d in allConfigs if filterOptions[keys[0]]==d[keys[0]][fieldName]]
    def two():
        return [d for d in allConfigs if filterOptions[keys[0]]==d[keys[0]][fieldName]
            and filterOptions[keys[1]]==d[keys[1]][fieldName]]
    def three():
        return [d for d in allConfigs if filterOptions[0]==d[keys[0]][fieldName]
            and filterOptions[keys[1]]==d[keys[1]][fieldName] 
            and filterOptions[keys[2]]==d[keys[2]][fieldName]]
    def four():
        return [d for d in allConfigs if filterOptions[keys[0]]==d[keys[0]][fieldName]
            and filterOptions[keys[1]]==d[keys[1]][fieldName] 
            and filterOptions[keys[2]]==d[keys[2]][fieldName]
            and filterOptions[keys[3]]==d[keys[3]][fieldName]]

    options = {0:zero(),1: one(),2: two(),3: three(),4: four()}

    return options[len(filterOptions)]()

1 个答案:

答案 0 :(得分:1)

似乎你已经做到了。但是你想要一个简洁的一句话吗?

这里是:

def config_filter(allConfigs, filterOptions, fieldName):
    return [d for d in allConfigs 
              if len([o for o in filterOptions 
                        if d[int(o)-1][fieldName] == filterOptions[o]])
                 == len(filterOptions) ]

l = [({"type":1},{"type":2},{"type":3},{"type":4}),
      ({"type":5},{"type":2},{"type":3},{"type":4}),
      ({"type":5},{"type":2},{"type":6},{"type":4}),
      ({"type":5},{"type":3},{"type":6},{"type":4}),
      ({"type":1},{"type":6},{"type":3},{"type":4}),
      ({"type":1},{"type":2},{"type":5},{"type":4}),
      ({"type":1},{"type":2},{"type":6},{"type":4})]
print(config_filter(l, {}, "type"))
print(config_filter(l, {1:5}, "type"))
print(config_filter(l, {1:5, 3:6}, "type"))
print(config_filter(l, {1:5, 3:6, 2:3}, "type"))