2012-07-05 82 views
1

我有一个Job类。下面是一个简化版本的一些样本作业:Python确保对象出现在列表的末尾

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列表(从DB)有些随意,但我需要确保任何Delete工作发生最后一次。我能想到的最简单的方法是确保将Delete作业移动到列表的末尾,然后按顺序处理列表。然而,当排序条件是一个类的属性时,我不确定如何做到这一点,并且是否有任何保证,这些列表将在处理作业时按顺序迭代?任何建议都会很棒。

+0

如果你需要一个特定的顺序,你可以只使用['heapq '](http://docs.python.org/library/heapq.html)并给予删除操作最低优先级。 – 2012-07-05 23:58:19

+0

谢谢@JeffMercado,最后不需要除Delete之外的命令,但我会检查heapq – MFB 2012-07-06 00:01:27

+0

我会尝试实施“最后处理”堆栈。 – 2012-07-06 00:09:43

回答

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

的关键将是“删除”工作False为“复制”或“扫描”工作和True。由于True>False“删除”作业将被排序到末尾

+0

辉煌,谢谢 – MFB 2012-07-06 00:09:37

1

这是一个将线索时间内的'Delete'作业更改为结束的功能。它不会保持秩序。使用sort在半排序数据和短名单上可能会更快,但我认为我会发布一个替代方案,因为gnibbler击败我排序选项(并且更好地启动)。

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 
+0

+1为线性选项。与此类似的作品http://stackoverflow.com/a/11337242/174728 – 2012-07-06 00:17:27

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作用将是巨大的任何建议,如它看起来有点讨厌。

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() 
+1

'__cmp__'被严重弃用... – JBernardo 2012-07-06 00:50:55

+0

@Jernner:确实如此。 (对不起,我似乎是从一本八岁的书里学习Python。) – Ryan 2012-07-06 01:16:17