튜플의 내용을 반복하지 않고 튜플 목록의 모든 조합을 생성하는 방법 dictionary = {(p,q):n}
을, 나는를 생성해야 p 또는 q가 새로운 사전 내에서 반복되지 않도록 모든 조합의 새 사전 목록. 그리고이 사전 목록을 생성하는 동안 또는 사전 값을 사용하는 계산을 기반으로 사전 중 하나를 원하는 것으로 선택하십시오. 내가 (하지만 훨씬 작은) 무슨 뜻인지의파이썬 :</p> <p>튜플와 사전 키 감안할 때 : 나는 수수께끼의 비트와 함께 일하고 있어요
예 :
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를 반복하기 때문에하지 허용됩니다.
내 sob 이야기 : 저는 코딩에 새로운 브랜드입니다. 그러나이 스크립트를 작성하여 일부 데이터를 분석하려고했습니다. 하지만 흥미로운 알고리즘 수수께끼라고 생각합니다. 아주 작은 사전으로 작동하는 무언가를 썼지 만 큰 것을 입력 할 때 너무 길어서 (아래 복사). 내 스크립트 시도에서 실제로 스크립트에서 나중에 내 마스터 사전을 참조하는 대신 튜플 조합의 목록을 생성했습니다. 나는 아래에 복사합니다 :
#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)
이 목록을 생성 한 후, 나는 모두에 함수를 적용 "ExpList1"와 "ExpList2"
사전 튜플 키는이 목록을 사용하여 생성 된 사전 조합 (튜플 목록을 반복하고 마스터 사전에서 각각의 값을 호출)을 선택하고 해당 함수에서 결과 값이 가장 작은 조합을 선택하십시오.
또한 고유 한 p, q 개를 선택하여 결과 값이 이전 값보다 작은 지 여부를 확인하고 유지하는 경우 함수를 적용하려고했습니다 (이것은 해당 목록을 생성하는 대신 " uniquecombolist ", 나는 최종 튜플리스트를 생성한다.) - 여전히 너무 오래 걸린다.
필자는 솔루션이 p 세대, q-no-repeat 및 조합 생성 중에 최종 선택 기능을 포함시키는 데 있다고 생각합니다. 나는 이것을 실제로하는 방법에 대해 머리를 감싸는 데 어려움을 겪고있다.
읽어 주셔서 감사합니다. 사라
편집 :
내가 쌍의 세트에 최종 기능 (기본적으로 루트 평균 제곱)을 통합 내 코드에 대한 대안을 썼다 명확히하기. 내가 설정 한 세대 동안 RMS 계산을 통합 만 작은 일을 계속 할 수 있다면
`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`
그래서, 나는 내 조합 문제를 해결할 것이라 생각합니다.
기준에 맞는 모든 가능한 쌍을 생성하고 싶습니까? 또는 'n'이 작은 생성 목록의 길이 인 쌍의 가능한 크기 'n'집합? –
@ JaredGoguen 각 쌍은 집합의 단일 항목입니다. p와 q는 반복 할 수 없으므로 세트에 n 개의 쌍이 있으므로 작은 생성 목록의 크기로 제한되어야합니다. 두 쌍의 튜플 쌍 (또는 튜플 키가있는 두 개의 사전)이 가능한 모든 가능한 집합을 생성하려고합니다. – Sara
itertools.combinations에 대한 코드를 살펴 보았습니다. 솔직히 말해서 조합에 대한 내 자신의 조건에서 적용 할 수있는 충분한 감각을 갖지 못하고 적용 할 필요가있는 최종 기능까지도 이해할 수 없습니다. 나는 https://stackoverflow.com/questions/24907913/explain-combination-function-of-python-module-itertools를 보았지만 여전히 불행하게도 실제로 어떻게 작동하는지 이해하지 못한다. 내가 내 글에서 말했듯이, 나는 이것 (나는 다른 하나의 대본을 썼고 컴퓨터 과학에서는 어떤 과목도 택한 적이 없다)에 대해 매우 익숙하다. 그래서 나는 아마도 내가 씹을 수있는 것보다 더 많이 물어 뜯고있다. – Sara