Я работаю над загадкой:
Учитывая словарь с кортежами для ключей: dictionary = {(p,q):n}
, мне нужно сгенерировать список новых словарей для каждой комбинации, чтобы ни p, ни q не повторялись в новом словаре. И во время создания этого списка словарей или после этого выберите один из словарей в качестве желаемого на основе расчета с использованием значений словаря.
пример того, что я имею в виду (но намного меньше):
dictionary = {(1,1): 1.0, (1,2): 2.0, (1,3): 2.5, (1,4): 5.0, (2,1): 3.5, (2,2): 6.0, (2,3): 4.0, (2,4): 1.0}
становится
listofdictionaries = [{(1,1): 1.0, (2,2): 6.0}, {(1,1): 1.0, (2,3): 4.0}, (1,1): 1.0, (2,4): 1.0}, {(1,2): 2.0, (2,1): 3.5}, {(1,2): 2.0, (2,3): 4.0},
и т. Д.
словарь вида: {(1,1): 1.0, (2,1): 3.5}
недопустим, потому что q повторяется.
Теперь моя печальная история: я новичок в программировании ... но я пытался написать этот сценарий для анализа некоторых моих данных. Но я также думаю, что это интересная загадка алгоритма. Я написал что-то, что работает с очень маленькими словарями, но когда я ввожу большой, его запуск занимает слишком много времени (скопировано ниже). В моей попытке скрипта я фактически сгенерировал список комбинаций кортежей, которые я использую для обращения к моему главному словарю позже в скрипте. Скопирую ниже:
Ключи словарного кортежа были созданы с использованием двух списков: «ExpList1» и «ExpList2»
#first, I generate all the tuple combinations from my ExpDict dictionary
combos =(itertools.combinations(ExpDict,min(len(ExpList1),len(ExpList2))))
#then I generate a list of only the combinations that don't repeat p or q
uniquecombolist = []
for foo in combos:
counter = 0
listofp = []
listofq = []
for bar in foo:
if bar[0] in listofp or bar[1] in listofq:
counter=+1
break
else:
listofp.append(bar[0])
listofq.append(bar[1])
if counter == 0:
uniquecombolist.append(foo)
После создания этого списка я применяю функцию ко всем комбинациям словарей (перебирая списки кортежей и вызываю их соответствующие значения из главного словаря) и выбираю комбинацию с наименьшим результирующим значением этой функции.
Я также попытался применить эту функцию, перебирая комбинации, выбирая уникальные p, q, а затем проверяя, меньше ли результирующее значение, чем предыдущее, и сохраняя его, если это так (это вместо создания этого списка «uniquecombolist», я в конечном итоге создается только окончательный список кортежей) - все еще занимает слишком много времени.
Я думаю, что решение заключается во внедрении p, q-no-repeat и последней функции выбора ВО ВРЕМЯ генерации комбинаций. Я просто не могу понять, как это сделать.
Спасибо за прочтение! Сара
РЕДАКТИРОВАТЬ:
Чтобы уточнить, я написал альтернативу своему коду, которая включает конечную функцию (в основном среднеквадратичное значение) для наборов пар.
`combos =(itertools.combinations(ExpDict,min(len(ExpList1),len(ExpList2))))
prevRMSD = float('inf')
for foo in combos:
counter = 0
distanceSUM = 0
listofp = []
listofq = []
for bar in foo:
if bar[0] in listofp or bar[1] in listofq:
counter=+1
break
else:
listofp.append(bar[0])
listofq.append(bar[1])
distanceSUM = distanceSUM + RMSDdict[bar]
RMSD = math.sqrt (distanceSUM**2/len(foo))
if counter == 0 and RMSD< prevRMSD:
chosencombo = foo
prevRMSD = RMSD`
Так что, если бы я мог включить расчет RMS во время генерации набора и оставить только самое маленькое, я думаю, это решит мою комбинаторную проблему.
n
наборов пар, гдеn
- длина меньшего генерирующего списка? - person Jared Goguen   schedule 04.10.2017