2017-05-15 8 views
0

다른 크기의리스트를 비교하면서 파이썬에서 문제가 있습니다. 제목에 언급 한 바와 같이, 마타 다운 보고서 파일의 제목 목록이 있습니다. 행은 각 열이 해당 제목과 일치하는 방식으로 정렬되어야합니다.리스트를 다른 크기로 비교하고 매치 결과를 파이썬의 Markdown 파일에 넣기

나는이 같은 구조를 가지고 파일에서 레코드를 읽고있다 :

|Filename=timer|Description=Signal Timer|OnBootSec=5min|Unit=some.service|WantedBy=some.target| 
|Filename=activator|Description=activator timer|OnBootSec=3min|OnUnitActiveSec=1hr|Unit=some.service|WantedBy=some.target|WantedBy=some.target| 
|Filename=mode|Description=mode timer|OnBootSec=4min|Unit=some.service|WantedBy=some.target| 
|Filename=reset|Description=reset timer|After=some.service|PartOf=some.service|OnActiveSec=1min|Unit=sometime.service|WantedBy=some.target| 

나는이 파일을 읽고 인하 형식으로 준비를합니다. 코드에 대해 누락 된 부분이 있습니다. 그러나 나는 나누고 싶습니다.

report = open (output,"w+") 
    for i in range(0,len(titles)): 
     report.write(titles[i]+"|") 
    report.write("\n") 
    report.close 
    for i in range(0,len(titles)): 
     report.write("|------") 
    report.write("|\n") 
    report.close 
    for i in range(0,len(titles)): 
     if (titles[i]==aList[i][1][0]): 
      report.write(aList[i][1][0] +'='+ aList[i][1][1]) 
     else: 
      report.write("|") 
    report.close 

마지막 for 루프에서 서식을 지정한 후 추가 "|" 요소가없는 필드를 생성하기 위해서.

[0, ['WantedBy', 'some.target|\n']] 

기본적으로, 첫 번째 요소는 상기 그룹 번호와 동일한 행에 기록 될 것 같은 그룹 번호가 각 레코드이다

이 외에도 aList에서 같은 구조를 갖는다. 두 번째 요소 집합은 키/값 쌍을 포함합니다. 그래서 나는 그들 사이에 "="사인을하고있다.

|Filename|Description|OnBootSec|Unit|WantedBy|OnUnitActiveSec|After|PartOf| 
|------|------|------|------|------|------|------|------| 
|Filename=timer|Description=Signal Timer|OnBootSec=5min|Unit=some.service|WantedBy=some.target| 
|Filename=activator|Description=activator timer|OnBootSec=3min|Unit=some.service|WantedBy=some.target WantedBy=some.target|OnUnitActiveSec=1hr||| 
|Filename=mode|Description=mode timer|OnBootSec=4min|Unit=some.service|WantedBy=some.target| 
|Filename=reset|Description=reset timer|OnActiveSec=1min|Unit=sometime.service|WantedBy=some.target||After=some.service|PartOf=some.service| 

내가 당신의 시간 및 의견을 보내 주셔서 감사합니다 :

원하는 인하 출력은 테이블입니다.

감사합니다.

P. http://dillinger.io/

+1

알리 스트 정의/설정은 어떻게됩니까? 그 코드를 보여줄 수 있습니까? 여기 –

+0

그것은이다 arrangedList '= [] \t 온도 = [] 키 \t, dict.items()의 값 : \t \t 온도 = 키 값] \t \t arrangedList.append (TEMP)' 기본적으로 사전에서. – Elesmoth

+0

와우! 그건 역효과 야. 아래를 참조하십시오. –

답변

1

문제에 대한 간단한 대답은 다음과 같습니다. 사전을 사용하십시오.

먼저 기존 코드 중 일부를 Python 코드로 다시 작성해 보겠습니다. 줄의 맨 부부는 샘플 데이터이며, 난 그냥 표준 출력에 인쇄 할 보고서 파일을 재설정 한하지만, 다른 것보다, 나는이 작업을 좀 더 쉽게 생각 :

titles = """ 
|Filename|Description|OnBootSec|Unit|WantedBy|OnUnitActiveSec|After|PartOf| 
""".strip().split('|')[1:-1] 

aRecord=""" 
|Filename=activator|Description=activator timer|OnBootSec=3min|Unit=some.service|WantedBy=some.target WantedBy=some.target|OnUnitActiveSec=1hr||| 
""".strip().split('|') 
aList = [('alist[_][0]?', f.split('=')) for f in aRecord if f] 


import sys 
with sys.stdout as report: 
#with open(output, 'w+') as report: 
    # Print header 
    print('|'.join(titles), file=report) 
    print('|'.join('-' * len(t) for t in titles), file=report) 

    format_str = '|'.join('{{:<{}s}}'.format(len(t)) for t in titles) 

    # Convert aList into a dictionary 
    record = dict((f[1][0],f[1][1]) for f in aList) 

    # Print rows 
    print(format_str.format(*(record.get(fld, '') for fld in titles), file=report)) 

당신은 알 수 있습니다 나는 aList를 사전으로 변환한다. 귀하의 의견을 바탕으로, 이미 그 값을 가진 사전이 있으므로, 나는 당신이 중간 사람을 제거 할 수 있다고 생각합니다.

열의 제목에 이미 해당 정보가 있으므로 필드 이름을 인쇄하지 않아도됩니다.

+0

이것은 가치가있다! 고마워, 내가 해결할거야. 문안 인사 – Elesmoth