我有一个非常独特的问题,我一直绞尽脑汁试图找出一个简洁而实用的解决方案。任何帮助都会非常感激。
我正在尝试过滤字典元组列表。我知道这听起来很复杂,但我保证这很有道理。
为了可视化,每个内部字典代表一种类型的球。我有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)]()
答案 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"))