1

Jobクラスがあります。これは、いくつかのサンプルジョブを含む簡略化されたバージョンです。

class Job:
    def __init__(self, type):
        self.type = type
    def __repr__(self):
        return '< %s >' % self.type

job1 = Job('Copy')
job2 = Job('Delete')
job3 = Job('Scan')

jobs = [job1,job2,job3]

私のアプリケーションでは、ジョブはjobs(データベースから)リストにいくらかランダムに追加されますが、すべてのDeleteジョブが最後に実行されるようにする必要があります。私が考えることができる最も簡単な方法は、Deleteジョブがリストの最後に移動され、リストが順番に処理されるようにすることです。ただし、並べ替え基準がクラスの属性である場合にそれを行う方法がわかりません。また、ジョブが処理されるときにリストが順番に繰り返されるという保証はありますか?どんなアドバイスも素晴らしいでしょう。

4

4 に答える 4

6
jobs.sort(key=lambda x:x.type=="Delete")

キーはFalse「コピー」または「スキャン」ジョブとTrue「削除」ジョブ用になります。True> False「削除」ジョブは最後までソートされるため

于 2012-07-05T23:56:01.330 に答える
2

ソートは安定していることが保証されているので、実装するだけ__cmp__です:

class Job:
    def __init__(self, type):
        self.type = type
    def __repr__(self):
        return '< %s >' % self.type
    def __cmp__(self, other):
        if self.type == 'Delete':
            return 0 if other.type == 'Delete' else 1

        return -1 if other.type == 'Delete' else 0

そして、処理する前にリストをソートします。

jobs.sort()
于 2012-07-05T23:58:08.477 に答える
1

'Delete'これは、線形時間でジョブを最後にシフトする関数です。ただし、順序は保持されません。セミソートされたデータや短いリストではおそらく使用が速くなりますが、 gnibblerがソートオプションに勝ったので(そして起動したほうがいいので)sort、別の方法を投稿すると思いました。

def shift_delete_jobs(jobs):
    end = len(jobs) - 1
    for i in reversed(range(len(jobs))):
        if jobs[i].type == 'Delete':
            jobs[end], jobs[i] = jobs[i], jobs[end]
            end -= 1
于 2012-07-05T23:56:47.487 に答える
0

私はジョブコンテナクラスを作成します:

class JobContainer(object):
  def __init__(self, jobs):
    self.jobs = jobs

  def get_type(self, type, invert=False):
    return [job for job in jobs if (job.type == type) ^ invert]

  def get_jobs(self):
    return self.get_type('Delete', invert=True) + self.get_type('Delete') 

そして、次のように使用します。

jobs = JobContainer([job1, job2, job3])
print jobs.get_jobs()

それはやや厄介に見えるので、機能を改善する方法についての提案はget_jobs素晴らしいでしょう。

于 2012-07-05T23:57:10.807 に答える