У меня есть довольно уникальная проблема здесь, когда я ломаю голову, пытаясь понять сжатое и функциональное решение. Любая помощь была бы высоко оценена.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)]()
Post код, который вы пробовали до сих пор. –
Я должен был добавить это раньше. Мои извинения. Проблема, о которой я вижу, не знает, что такое словарь. Проблема с приведенным выше кодом заключается в том, что когда производятся определения функций, индекс «ключей» будет за пределами границ. – m25