1

まず、タイトルについてお詫び申し上げます。この問題をより具体的に解決する方法がわかりません。次のアクションのリストを収集するスクリプトを作成しようとしています (Getting Things Done メソッドのように) に基づいてTaskPaper フォーマットを使用したプロジェクトの完全なリスト。これは、スクリプトに入る種類の文字列の例です。

Inbox:

Project 01:
    - Task 01
    - Task 02
    - Task 03

Project 02:
    - Task 01
    - Task 02
    - Task 03
    - Task 04

ループできるメインリスト内のすべてのプロジェクトからリストを作成することができました。これが私のスクリプトの実際の状態です。arg[1]前述の文字列と考えてください:

allTasks = arg[1].split('\n\n')

projects = [filter(None,proj.split('\n')) for proj in allTasks]

next_actions = [task[:2] for task in projects if len(task) > 1]

変数next_actionsは次のリストになります。[['Project 01:', '\t- Task 01'], ['Project 02:', '\t- Task 01']]これはまさに私が望むとおりですが、これらのタスクの 1 つにサブタスクを追加すると、次のようになります。

Project 01:
    - Task 01
        - Subtask 01
        - Subtask 02
        - Subtask 03
    - Task 02
    - Task 03

スクリプトを実行すると、next_actions変数は変更されません (理由はわかっていますが、解決方法はわかりません)。[['Project 01:', '\t- Task 01\n\t\t- Subtask 01\n\t\t- Subtask 02\n\t\t- Subtask 03'], ['Project 02:', '\t- Task 01']]サブタスクをサポートできるように、結果を次のようにしたかったのです。おそらく、以前にサブタスクを含むタスクを特定し、それらからリストを作成することで問題が解決する可能性がありますが、どこから始めればよいかわかりません。

必要な情報がありませんでしたか? お知らせください。できるだけ早く返信いたします。お手伝いありがとう。

4

3 に答える 3

2

洗練された方法や最善の方法とは言えませんが、このタスクにはネストされたデータ構造を活用する必要があると思います。

次のタスク ディクショナリがあるとします。

t = {'Inbox':[],

    'Project 01': [
        ['Task 01',['subtask 1', 'subtask 2']],
        'Task 02',
        'Task 03'
    ],
    'Project 02':[
        ['Task 01',['subtask 1', 'subtask 2','subtask 3', 'subtask 4']],
        'Task 02',
        'Task 03',
        'Task 04'
    ]
}

このコードは、サブタスクを持つ次のアクションを比較的簡単に処理する必要があります。

print "Next Actions"
for i in t:
    if len(t[i]) > 0:
        print "\n%s:" %i

        if isinstance(t[i][0], list):
            print "- %s" %(t[i][0][0])
            for st in t[i][0][1]:
                print "\t- %s" %(st)
        else:
            print t[i][0]

これは出力されます:

Next Actions

Project 01:
- Task 01
    - subtask 1
    - subtask 2

Project 02:
- Task 01
    - subtask 1
    - subtask 2
    - subtask 3
    - subtask 4

または、最初のリストとコードを出発点として使用すると、次の方法で目的の結果を得ることができます。これは、次のアクションに関連付けられたコメント処理することに注意してください。

リストを考えると

t = '''Inbox:

Project 01:
    - Task 01
    this is a comment
    this is still a comment associate with task 01
        - sub 01
        - sub 02
        - sub 05
    - Task 02
    - Task 03
        - sub 03
        - sub 04

Project 02:
    - Task 01
        - proj 2 sub 01
    - Task 02
    - Task 03
    - Task 04'''

次のコードにより、目的の結果が得られるはずです。今私は限られたデータでこれをテストしただけで、もっと最適な方法があるはずですが、今のところこれが私が持っているものです:

temp_list = {}
temp_sub = []
final_list = {}

allTasks = t.split('\n\n')
projects = [filter(None,proj.split('\n\t')) for proj in allTasks]

for i in projects:
    temp_list[i[0]]=i[1:]

for key,value in temp_list.iteritems():
    if len(value) > 0:
        temp_sub = []
        for s in range(1,(len(value)-1)):   
            if value[s].startswith('\t') or not value[s].startswith('-'):
                temp_sub.append(value[s])
            else:
                break
        final_list[key]=[value[0],temp_sub]

for key, value in final_list.iteritems():
    print key
    for sub in value:
        if len(value)>0 and len(sub)>0:
            if isinstance(sub, list):
                for item in sub:
                    print item
            else: 
                print sub

出力は次のようになります。

    Project 02:
- Task 01
    - proj 2 sub 01
Project 01:
- Task 01
this is a comment
this is still a comment associate with task 01
    - sub 01
    - sub 02
    - sub 05

その場でディクショナリを作成しているため、最終結果 (プロジェクト) の順序が失われます。何らかの形式の順序付けを維持するには、追加のコードが必要になると思います。

于 2013-11-13T16:43:36.123 に答える
1

re.split() を使用して合理的な解決策を見つけました

re.split('\n(?=^\t-\s)', arg[1], 0, re.M)

arg[1] はタスクの完全な文字列であるため、このアクションは\n、単一のタスクのみを持つすべてのタスクの前の改行で分割されます。次の文字列を考慮します。

Project 01:
    - Task 01
        - Subtask 01
        - Subtask 02
        - Subtask 03
    - Task 02
    - Task 03

前述の re.split() はこのリストを作成します:

['Project 01:', '\t- Task 01\n\t\t- Subtask 01\n\t\t- Subtask 02\n\t\t- Subtask 03', '\t- Task 02', '\t- Task 03']

project[:2]その後、この質問の本当の意図に従って、ループを使用して各「プロジェクト」に個別にアプローチし、プロジェクトごとに次のアクションを収集できます。ずっと助けてくれてありがとう、ペドロ (:

于 2013-11-19T02:56:43.647 に答える
1

前の回答は無視してください。私は、いつものように物事を過度に複雑にしました。これにより、目的の結果をレンダリングしながら、よりシンプルで短いことが証明されるはずです。

ソースリスト

t = '''Inbox:

Project 01:
    - Task 01
    this is a comment
    this is still a comment associate with task 01
        - sub 01
        - sub 02
        - sub 05
    - Task 02
    - Task 03
        - sub 03
        - sub 04

Project 02:
    - Task 01
        - proj 2 sub 01
    - Task 02
    - Task 03
    - Task 04'''

脚本

allTasks = t.split('\n\n')
projects = [filter(None,proj.split('\n\t')) for proj in allTasks]

for i in projects:
    if len(i[1:])>0:
        print i[0]
        print i[1]
        for s in range(2,len(i[1:])):
            if i[s].startswith("\t") or not i[s].startswith("-"):
                print i[s]
            else:
                break

出力

Project 01:
- Task 01
this is a comment
this is still a comment associate with task 01
    - sub 01
    - sub 02
    - sub 05
Project 02:
- Task 01
    - proj 2 sub 01

これにより、使用するコードが少なくなり、プロジェクトの順序も維持されます。

于 2013-11-14T16:26:18.507 に答える