我有一个相当复杂的数据结构,所以我会尽力表达......
这个 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])}]
[{'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])}]
[{'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运行程序并计算它们的覆盖范围。