파이썬은 테이블에 대해 가능한 모든 조합을 계산합니다.

Karyo

다음과 같은 테이블이 있습니다.

   PotA  PotB  PotC  PotD  PotE
A   +     +     +     +     +
B   -     ?     +     +     ?
C   +     +     +     +     +
D   +     -     +     -     +
E   +     +     +     +     +

여기에서 "+", "-"및 "?"의 가능한 모든 조합을 찾아야합니다. (PotA 및 PotB), (PotA 및 PotC) 등의 모든 조합 (PotA, PotB 및 PotC), 마지막으로 (PotA, PotB, PotC, PotD 및 PotE). 실제로 "Pot"행은 계속 진행되지만 여기서는 단순화를 위해 PotE까지만 표시합니다.

이를 위해 먼저 다음과 같이 파일을 읽은 다음 각 가능성을 계산하기 위해 두 가지 조합에 대해 가능한 모든 가능성을 생성합니다.

def readDatafile():
    filename = ("data.txt")
    infile = open(filename,'r')

    for line in infile.readlines():
        line = line.strip()
        print (line)          # just to check the data, need to carry on from here.

"""Generate all possible permutations for later count"""
def doPermutations(items, n):
    if n == 0:
        yield ''
    else:
        for i in range(len(items)):
            for base in doPermutations(items, n - 1):
                yield str(items[i]) + str(base)

def makeAllPossibleList():
    nlength      = 2          # This should go outside of the function and will be same as the number of Pots
    lpossibility = ['+', '-', '?']
    litems       = []

    for i in doPermutations(lpossibility, int(nlength)):
        litems.append(i)

    for x in items:
        print (x)             # This generate all the possible items for combination of two

따라서 최종 결과는 다음과 같습니다.

Combination: Possibility Count
PotA, PotB: ++ 3
PotA, PotB: +- 1
PotA, PotB: +? 0
PotA, PotB: -+ 0
PotA, PotB: -- 0
PotA, PotB: -? 1
PotA, PotB: ?+ 0
PotA, PotB: ?- 0
PotA, PotB: ?? 0
PotA, PotC: ...
PotA, PotC: ...
.......
PotA, PotB, PotC, PotD, PotE: +++++ 3
PotA, PotB, PotC, PotD, PotE: ++++- 0
PotA, PotB, PotC, PotD, PotE: ++++? 0
.......

이 문제에 대한 적절한 논리를 얻는 좋은 파이썬 방법이 있습니까? 헤더는 키로, 열은 목록의 값으로 읽어야합니까?

나는 적절한 논리를 얻을 수 없습니다. 도와주세요.

DSM

내가 당신이 무엇을 추구하는지 이해한다고 가정하면 다음과 같은 것은 어떻습니까?

import itertools
import collections

def read_table(filename):
    with open(filename) as fp:
        header = next(fp).split()
        rows = [line.split()[1:] for line in fp if line.strip()]
        columns = zip(*rows)
    data = dict(zip(header, columns))
    return data

table = read_table("data.txt")
pots = sorted(table)

alphabet = "+-?"
for num in range(2, len(table)+1):
    for group in itertools.combinations(pots, num):
        patterns = zip(*[table[p] for p in group])
        counts = collections.Counter(patterns)
        for poss in itertools.product(alphabet, repeat=num):
            print ', '.join(group) + ':',
            print ''.join(poss), counts[poss]

다음을 생성합니다.

PotA, PotB: ++ 3
PotA, PotB: +- 1
PotA, PotB: +? 0
PotA, PotB: -+ 0
PotA, PotB: -- 0
PotA, PotB: -? 1
PotA, PotB: ?+ 0
PotA, PotB: ?- 0
PotA, PotB: ?? 0
PotA, PotC: ++ 4
[...]
PotA, PotB, PotC, PotD, PotE: +++++ 3
PotA, PotB, PotC, PotD, PotE: ++++- 0
[...]

이 줄에서 원하는 출력이 오류라고 가정합니다.

PotA, PotB, PotC, PotD, PotE: ++++++ 2

왼쪽에는 5 개의 열이 있지만 오른쪽에는 6 개의 +기호가 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관