2015-03-16 8 views
-1

У меня есть довольно уникальная проблема здесь, когда я ломаю голову, пытаясь понять сжатое и функциональное решение. Любая помощь была бы высоко оценена.python, фильтрующий список комбинаций

Я пытаюсь отфильтровать список кортежей словарей. Я знаю, что это звучит сложно, но я имею в виду.

Для визуализации каждый внутренний словарь представляет собой тип шара. У меня 4 коробки. Каждый из них будет содержать один мяч. Набор из 4 ящиков представлен кортежем длиной 4. Мне пришлось найти каждую уникальную комбинацию шаров в наборе из четырех ящиков. Поэтому, если у меня было 6 мячей, у меня есть 4^6 уникальных комбинаций и, следовательно, кортежи в списке. После использования itertools у меня есть этот список комбинаций (список кортежей) с различными комбинациями мячей (словари). Теперь, когда у меня есть этот эпический список уникальных комбинаций, мне нужно отфильтровать те, которые я хочу обработать. Я хочу отфильтровать только комбинации (кортежи) с шаром, например 'type1', в поле 1 (индекс кортежа 1) и тип 0, например, в поле 3. Результатом будет список кортежей словарей или список комбинаций, где определенные типы мячей, где в определенных ящиках.

Я вижу, что лучшим способом ввода является словарь, такой как {1: 'type1', 3: 'type3'} для примера выше. Словарь ввода был бы, скорее всего, {1: _, 2: _, 3: _, 4: _}. И если у кого есть другие предложения о том, как передать эти параметры фильтра, я очень открыт для предложений.

Я представляю себе понимание списка с помощью лямбда-функции с И в ней? Однако, похоже, ничего не получается.

Некоторые из вас, ребята, являются волшебниками с пониманием списка/словаря и соответствующими внутренними функциями, чтобы получить то, что вы хотите, в лаконичной функциональности. Если вы ответите на это, можете ли вы рассказать мне, как это работает и почему оно работает. Попытка учиться у мозга.

То, что я до сих пор:

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)]() 
+4

Post код, который вы пробовали до сих пор. –

+0

Я должен был добавить это раньше. Мои извинения. Проблема, о которой я вижу, не знает, что такое словарь. Проблема с приведенным выше кодом заключается в том, что когда производятся определения функций, индекс «ключей» будет за пределами границ. – m25

ответ

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")) 
+0

Это было похоже на работу, но у меня были проблемы с индексами. Ваш вариант исключительно гладкий. Значит, вы правильно поняли понимание в понимании? Я понимаю внешний. Теперь, если я правильно смотрю, конфигурация правильна, если число фильтров равно true == количество параметров фильтра. Большое вам спасибо за то, что потратили время. это было прекрасно. – m25