Как я могу выдвинуть значения в многомерном массиве

class unique_element:
    def __init__(self,value,occurrences):
        self.value = value
        self.occurrences = occurrences

def perm_unique(elements):
    eset=set(elements)
    listunique = [unique_element(i,elements.count(i)) for i in eset]
    u=len(elements)
    return perm_unique_helper(listunique,[0]*u,u-1)

def perm_unique_helper(listunique,result_list,d):
    if d < 0:
        yield tuple(result_list)
    else:
        for i in listunique:
            if i.occurrences > 0:
                result_list[d]=i.value
                i.occurrences-=1
                for g in  perm_unique_helper(listunique,result_list,d-1):
                    yield g
                i.occurrences+=1




a = list(perm_unique([1,1,2]))
print(a)

result:

[(2, 1, 1), (1, 2, 1), (1, 1, 2)]

EDIT (как это работает):

Я переписал верхнюю программу более длинной, но более читаемой

Обычно мне сложно объяснить, как что-то работает, но позвольте мне попробовать. Чтобы понять, как это работает, вам нужно понять схожую, но более простую программу, которая даст все перестановки с повторением.

def permutations_with_replacement(elements,n):
    return permutations_helper(elements,[0]*n,n-1)#this is generator

def permutations_helper(elements,result_list,d):
    if d<0:
        yield tuple(result_list)
    else:
        for i in elements:
            result_list[d]=i
            all_permutations = permutations_helper(elements,result_list,d-1)#this is generator
            for g in all_permutations:
                yield g

Эта программа, очевидно, намного проще: d обозначает глубину в permutations_helper и имеет две функции. Одна из функций - это условие остановки нашего рекурсивного алгоритма, а другое - для списка результатов, которое передается.

Вместо того, чтобы возвращать каждый результат, мы его даем. Если функции / оператора yield не было, нам пришлось бы вывести результат в какую-то очередь в точке остановки. Но таким образом, как только условие остановки встречается, результат распространяется через весь стек до вызывающего. Это цель for g in perm_unique_helper(listunique,result_list,d-1): yield g, поэтому каждый результат распространяется до вызывающего.

Вернуться к исходной программе: У нас есть список уникальных элементов. Прежде чем мы сможем использовать каждый элемент, мы должны проверить, сколько из них все еще доступно, чтобы нажать его на result_list. Работа этой программы очень похожа по сравнению с permutations_with_replacement разницей в том, что каждый элемент не может повторяться больше раз, чем в perm_unique_helper.

1
задан Zakaria Acharki 18 March 2019 в 15:38
поделиться

1 ответ

$("a").click(function() {
  pushOrRemove($(this).data('value'), $(this).data('key'))
});

function pushOrRemove(value, array_key) {
  // get the variable you store the json in
  var $storedValues = $('[data-stored-values]');
  // if the json is not set, default to an empty object
  var attribute_values = JSON.parse($storedValues.val() || '{}');
  
  // if the key is not in the object yet, defaultto an empty array
  attribute_values[array_key] = attribute_values[array_key] || [];
  
  // get the index of the value
  var indexOfValue = attribute_values[array_key].indexOf(value);
  
  // if the index is -1, it's not in there, so add
  if (indexOfValue < 0) {
    attribute_values[array_key].push(value);
  } else {
    // the index was 0 or more, so remove it
    attribute_values[array_key].splice(indexOfValue, 1);
  }

  // update the stored json for the next interaction
  $storedValues.val(JSON.stringify(attribute_values));
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="#" data-value="10" data-key="20">Click</a>
<a href="#" data-value="20" data-key="20">Click</a>
<a href="#" data-value="30" data-key="20">Click</a>

<a href="#" data-value="10" data-key="30">Click</a>
<a href="#" data-value="20" data-key="30">Click</a>
<a href="#" data-value="30" data-key="30">Click</a>




<input type="text" data-stored-values>

0
ответ дан Taplar 18 March 2019 в 15:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: