Python sorted()将多个相同的元素添加到列表

时间:2015-11-18 18:20:01

标签: python python-2.7 sorting

我有一个相当复杂的数据结构,所以我会尽力表达......

这个 tl; dr 版本是我有2个项目的列表,运行已排序,现在我在列表中有4个项目?

我的自定义类是:

class Additional(object):
    def __init__(self, tests): #tests is my complicated data structure
        self.tests = tests
        for test in self.tests:
            self.statement_coverage_tests.append(self.tests[test].get('statements'))
            self.branch_coverage_tests.append(self.tests[test].get('branches'))
        # sort the branch and statement by their coverage count
        # this is the culprit?
        sa = sorted(self.statement_coverage_tests,
                   key=lambda x: x['covered_count'], reverse=True)
        # denoted as output1
        print sa

        self.results['statements'].append(sa[0])
        # we don't care about it anymore
        del sa[0]

        # resort based on different criteria now
        sb = sorted(sa, cmp=self.compare_statements)
        # denoted as output2
        print sb

    def compare_statements(self, a, b):
        if len(a['covered'] - self.results['statements'][-1]['covered']) > \
            len(b['covered'] - self.results['statements'][-1]['covered']):
            return 1
        elif len(a['covered'] - self.results['statements'][-1]['covered']) < \
            len(b['covered'] - self.results['statements'][-1]['covered']):
            return -1
        else:
            return 0

打印tests[x]['statements']

[{'id': 0, 'not_count': 12, 'covered_count': 48, 'coverage': {128: True, 132: False, 133: True, 134: False, 135: True, 136: False, 138: True, 139: True, 141: True, 148: True, 150: False, 151: False, 152: False, 153: False, 154: False, 155: False, 157: True, 158: True, 159: True, 160: True, 161: True, 162: True, 163: True, 164: True, 165: True, 166: True, 167: True, 168: True, 169: True, 171: True, 172: True, 173: False, 50: True, 51: True, 52: True, 53: True, 54: True, 58: True, 63: True, 72: True, 73: True, 75: True, 76: True, 79: False, 81: True, 90: True, 91: True, 93: True, 94: True, 97: False, 99: True, 104: True, 109: True, 118: True, 119: True, 120: True, 122: True, 124: True, 126: True, 127: True}, 'output': '0', 'not': set([97, 132, 134, 136, 173, 79, 150, 151, 152, 153, 154, 155]), 'covered': set([128, 133, 135, 138, 139, 141, 148, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 171, 172, 50, 51, 52, 53, 54, 58, 63, 72, 73, 75, 76, 81, 90, 91, 93, 94, 99, 104, 109, 118, 119, 120, 122, 124, 126, 127])}, 
{'id': 1, 'not_count': 12, 'covered_count': 48, 'coverage': {128: True, 132: False, 133: True, 134: False, 135: True, 136: False, 138: True, 139: True, 141: True, 148: True, 150: False, 151: False, 152: False, 153: False, 154: False, 155: False, 157: True, 158: True, 159: True, 160: True, 161: True, 162: True, 163: True, 164: True, 165: True, 166: True, 167: True, 168: True, 169: True, 171: True, 172: True, 173: False, 50: True, 51: True, 52: True, 53: True, 54: True, 58: True, 63: True, 72: True, 73: True, 75: True, 76: True, 79: False, 81: True, 90: True, 91: True, 93: True, 94: True, 97: False, 99: True, 104: True, 109: True, 118: True, 119: True, 120: True, 122: True, 124: True, 126: True, 127: True}, 'output': '0', 'not': set([97, 132, 134, 136, 173, 79, 150, 151, 152, 153, 154, 155]), 'covered': set([128, 133, 135, 138, 139, 141, 148, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 171, 172, 50, 51, 52, 53, 54, 58, 63, 72, 73, 75, 76, 81, 90, 91, 93, 94, 99, 104, 109, 118, 119, 120, 122, 124, 126, 127])}]

输出1

[{'id': 0, 'not_count': 12, 'covered_count': 48, 'coverage': {128: True, 132: False, 133: True, 134: False, 135: True, 136: False, 138: True, 139: True, 141: True, 148: True, 150: False, 151: False, 152: False, 153: False, 154: False, 155: False, 157: True, 158: True, 159: True, 160: True, 161: True, 162: True, 163: True, 164: True, 165: True, 166: True, 167: True, 168: True, 169: True, 171: True, 172: True, 173: False, 50: True, 51: True, 52: True, 53: True, 54: True, 58: True, 63: True, 72: True, 73: True, 75: True, 76: True, 79: False, 81: True, 90: True, 91: True, 93: True, 94: True, 97: False, 99: True, 104: True, 109: True, 118: True, 119: True, 120: True, 122: True, 124: True, 126: True, 127: True}, 'output': '0', 'not': set([97, 132, 134, 136, 173, 79, 150, 151, 152, 153, 154, 155]), 'covered': set([128, 133, 135, 138, 139, 141, 148, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 171, 172, 50, 51, 52, 53, 54, 58, 63, 72, 73, 75, 76, 81, 90, 91, 93, 94, 99, 104, 109, 118, 119, 120, 122, 124, 126, 127])}, 
{'id': 1, 'not_count': 12, 'covered_count': 48, 'coverage': {128: True, 132: False, 133: True, 134: False, 135: True, 136: False, 138: True, 139: True, 141: True, 148: True, 150: False, 151: False, 152: False, 153: False, 154: False, 155: False, 157: True, 158: True, 159: True, 160: True, 161: True, 162: True, 163: True, 164: True, 165: True, 166: True, 167: True, 168: True, 169: True, 171: True, 172: True, 173: False, 50: True, 51: True, 52: True, 53: True, 54: True, 58: True, 63: True, 72: True, 73: True, 75: True, 76: True, 79: False, 81: True, 90: True, 91: True, 93: True, 94: True, 97: False, 99: True, 104: True, 109: True, 118: True, 119: True, 120: True, 122: True, 124: True, 126: True, 127: True}, 'output': '0', 'not': set([97, 132, 134, 136, 173, 79, 150, 151, 152, 153, 154, 155]), 'covered': set([128, 133, 135, 138, 139, 141, 148, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 171, 172, 50, 51, 52, 53, 54, 58, 63, 72, 73, 75, 76, 81, 90, 91, 93, 94, 99, 104, 109, 118, 119, 120, 122, 124, 126, 127])}, 
{'id': 0, 'not_count': 12, 'covered_count': 48, 'coverage': {128: True, 132: False, 133: True, 134: False, 135: True, 136: False, 138: True, 139: True, 141: True, 148: True, 150: False, 151: False, 152: False, 153: False, 154: False, 155: False, 157: True, 158: True, 159: True, 160: True, 161: True, 162: True, 163: True, 164: True, 165: True, 166: True, 167: True, 168: True, 169: True, 171: True, 172: True, 173: False, 50: True, 51: True, 52: True, 53: True, 54: True, 58: True, 63: True, 72: True, 73: True, 75: True, 76: True, 79: False, 81: True, 90: True, 91: True, 93: True, 94: True, 97: False, 99: True, 104: True, 109: True, 118: True, 119: True, 120: True, 122: True, 124: True, 126: True, 127: True}, 'output': '0', 'not': set([97, 132, 134, 136, 173, 79, 150, 151, 152, 153, 154, 155]), 'covered': set([128, 133, 135, 138, 139, 141, 148, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 171, 172, 50, 51, 52, 53, 54, 58, 63, 72, 73, 75, 76, 81, 90, 91, 93, 94, 99, 104, 109, 118, 119, 120, 122, 124, 126, 127])}, 
{'id': 1, 'not_count': 12, 'covered_count': 48, 'coverage': {128: True, 132: False, 133: True, 134: False, 135: True, 136: False, 138: True, 139: True, 141: True, 148: True, 150: False, 151: False, 152: False, 153: False, 154: False, 155: False, 157: True, 158: True, 159: True, 160: True, 161: True, 162: True, 163: True, 164: True, 165: True, 166: True, 167: True, 168: True, 169: True, 171: True, 172: True, 173: False, 50: True, 51: True, 52: True, 53: True, 54: True, 58: True, 63: True, 72: True, 73: True, 75: True, 76: True, 79: False, 81: True, 90: True, 91: True, 93: True, 94: True, 97: False, 99: True, 104: True, 109: True, 118: True, 119: True, 120: True, 122: True, 124: True, 126: True, 127: True}, 'output': '0', 'not': set([97, 132, 134, 136, 173, 79, 150, 151, 152, 153, 154, 155]), 'covered': set([128, 133, 135, 138, 139, 141, 148, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 171, 172, 50, 51, 52, 53, 54, 58, 63, 72, 73, 75, 76, 81, 90, 91, 93, 94, 99, 104, 109, 118, 119, 120, 122, 124, 126, 127])}]

输出2:

[{'id': 1, 'not_count': 12, 'covered_count': 48, 'coverage': {128: True, 132: False, 133: True, 134: False, 135: True, 136: False, 138: True, 139: True, 141: True, 148: True, 150: False, 151: False, 152: False, 153: False, 154: False, 155: False, 157: True, 158: True, 159: True, 160: True, 161: True, 162: True, 163: True, 164: True, 165: True, 166: True, 167: True, 168: True, 169: True, 171: True, 172: True, 173: False, 50: True, 51: True, 52: True, 53: True, 54: True, 58: True, 63: True, 72: True, 73: True, 75: True, 76: True, 79: False, 81: True, 90: True, 91: True, 93: True, 94: True, 97: False, 99: True, 104: True, 109: True, 118: True, 119: True, 120: True, 122: True, 124: True, 126: True, 127: True}, 'output': '0', 'not': set([97, 132, 134, 136, 173, 79, 150, 151, 152, 153, 154, 155]), 'covered': set([128, 133, 135, 138, 139, 141, 148, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 171, 172, 50, 51, 52, 53, 54, 58, 63, 72, 73, 75, 76, 81, 90, 91, 93, 94, 99, 104, 109, 118, 119, 120, 122, 124, 126, 127])}, 
{'id': 0', not_count': 12, 'covered_count': 48, 'coverage': {128: True, 132: False, 133: True, 134: False, 135: True, 136: False, 138: True, 139: True, 141: True, 148: True, 150: False, 151: False, 152: False, 153: False, 154: False, 155: False, 157: True, 158: True, 159: True, 160: True, 161: True, 162: True, 163: True, 164: True, 165: True, 166: True, 167: True, 168: True, 169: True, 171: True, 172: True, 173: False, 50: True, 51: True, 52: True, 53: True, 54: True, 58: True, 63: True, 72: True, 73: True, 75: True, 76: True, 79: False, 81: True, 90: True, 91: True, 93: True, 94: True, 97: False, 99: True, 104: True, 109: True, 118: True, 119: True, 120: True, 122: True, 124: True, 126: True, 127: True}, 'output': '0', 'not': set([97, 132, 134, 136, 173, 79, 150, 151, 152, 153, 154, 155]), 'covered': set([128, 133, 135, 138, 139, 141, 148, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 171, 172, 50, 51, 52, 53, 54, 58, 63, 72, 73, 75, 76, 81, 90, 91, 93, 94, 99, 104, 109, 118, 119, 120, 122, 124, 126, 127])}, 
{'id': 1, 'not_count': 12, 'covered_count': 48, 'coverage': {128: True, 132: False, 133: True, 134: False, 135: True, 136: False, 138: True, 139: True, 141: True, 148: True, 150: False, 151: False, 152: False, 153: False, 154: False, 155: False, 157: True, 158: True, 159: True, 160: True, 161: True, 162: True, 163: True, 164: True, 165: True, 166: True, 167: True, 168: True, 169: True, 171: True, 172: True, 173: False, 50: True, 51: True, 52: True, 53: True, 54: True, 58: True, 63: True, 72: True, 73: True, 75: True, 76: True, 79: False, 81: True, 90: True, 91: True, 93: True, 94: True, 97: False, 99: True, 104: True, 109: True, 118: True, 119: True, 120: True, 122: True, 124: True, 126: True, 127: True}, 'output': '0', 'not': set([97, 132, 134, 136, 173, 79, 150, 151, 152, 153, 154, 155]), 'covered': set([128, 133, 135, 138, 139, 141, 148, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 171, 172, 50, 51, 52, 53, 54, 58, 63, 72, 73, 75, 76, 81, 90, 91, 93, 94, 99, 104, 109, 118, 119, 120, 122, 124, 126, 127])}]

此预期输出将严格{'id': 1...}我现在甚至不关心排序的准确性,我严格关心有条件是将元素的副本添加到列表中。很难给你一个代码片段来运行并自己生成 - 因为输入是针对gcov运行程序并计算它们的覆盖范围。

0 个答案:

没有答案