1

スクリプトのリストを検索し、各スクリプトを解析して、とりわけ添字を見つけています。

下付き文字を見つけるたびに、検索中のスクリプトのリストに追加したいと考えています。

私はこの while ループを思いつきました:

while keep_checking == True:
    TMP = deepcopy(FILE_LIST)
    for fname in TMP:
        if not fname in processed:
            SCL_FILE = fname
            break
    handleSCL(SCL_FILE)
    processed.add(SCL_FILE)
    if processed == FILE_LIST:
        keep_checking = False
        break

上記のコードは仕事dirty. handleSCL()をしますが、ファイルを検索して、新しい添字を に追加しているように感じますFILE_LIST

これを行うよりクリーンな方法はありますか?

4

4 に答える 4

1

A* パスファインディング アルゴリズムに似た方法を使用します (パスファインディング部分を除いて)。

  • リストを開く:まだ検査されていないファイルを配置します。
  • クローズド リスト:既に検査済みのファイルを配置します。

最初のファイルをオープンリストに追加することから始めます。次に、openlist 内のすべての要素を反復処理します。要素ごとにすべてのファイルを検索し、新しいファイルごとに、それがいずれかのリストにあるかどうかを確認します。どちらにもない場合は、openlist に追加します。要素の処理が終了したら、closedlist に追加します。

これは、重複することなくすべての要素を通過する非常に効果的でクリーンな方法です。

編集:さらに検討すると、1 つの順序付きリストを使用して、それを繰り返し、リストの最後に新しいファイルを追加することができます。[beginning-current] はクローズドリスト、[current-end] はオープンリストです。A* には、並べ替えとパス コストの計算のために 2 つのリストが必要ですが、完全な検索を行っているため、その機能は必要ありません。次に、単一のリストに「存在しない場合は追加」が必要です。

于 2012-09-13T18:35:05.490 に答える
1

あなたのループにはいくつかのクリーンアップが必要です!

breakwhile ループから抜け出します。keep_checking は必要ありません。TMP も必要ありません。for ループで直接使用します。

while processed != FILE_LIST:
    for fname in deepcopy(FILE_LIST):
        if not fname in processed:
            SCL_FILE = fname
            break

    handleSCL(SCL_FILE)
    processed.add(SCL_FILE)

より少ないコードで同じ作業を行います。

于 2012-09-13T18:41:54.820 に答える
0

よく考えた結果、簡単なカスタム キューを作成することになりました。

class PerQueue(object):

    def __init__(self):
        self._init()
        self.all_files = set()
        self.current   = None
        self.files     = set()
        self._init     = False
        self.cur_files = set()

    def _setflag(self, value):
        self._init = value
        for item in self.all_files:
            if item.startswith('ss'):
                self.cur_files.add(item)

    def _getflag(self):
        return self._init

    def empty(self):
        n = self._empty()
        return n

    def pushMany(self, itemList):
        for item in itemList:
            self.push(item)

    def push(self, item):
        if not item in self.all_files and not item in self.files:
            self._put(item)

    def pop(self):
        # I don't want errors
        if not self.empty():
            self.current = self._get()
            self.all_files.add(self.current)
            if self.init:
                self.cur_files.add(self.current)
        else:
            self.current = None
        return self.current

    def _init(self):
        self.files = set()

    def _empty(self):
        return not self.files

    def _get(self):
        return self.files.pop()

    def _put(self, item):
        self.files.add(item)

    init = property(_getflag, _setflag)

これにより、init フラグとともに (all_files と cur_files を使用して) いくつかの特別な条件を処理することができました。常に処理するファイルはせいぜい数百個なので、サイズの制約について心配する必要はありませんでした。

于 2012-11-12T18:33:20.833 に答える
0

これはかなりきれいになります...そしておそらくこの時点では不要です:

for fname in deepcopy(FILE_LIST):
     handleSCL(fname)
于 2016-04-26T07:55:54.543 に答える