Muffinss Skrevet 2. mai 2014 Skrevet 2. mai 2014 Har følgende dictionary: res = result['result']._asdict() res.keys() ['EGOVMON.CRE.1.2', 'EGOVMON.PDF.03', 'EGOVMON.PDF.05', 'WCAG.PDF.14', 'EGOVMON.TITLE.1.2'] Ønsker her å filtrere nøklene. Kun de som starter med 'EGOVMON.PDF' og 'WCAG.PDF'. Dette er hva vi har så langt: filterkeys=[v for k,v in res.items() if k.startswith('EGOVMON.PDF') or k.startswith('WCAG.PDF')] print filterkeys, vil gi oss et nytt dictionary: [[<SOAPpy.Types.structType item at 140493364567432>: {'column': 1, 'line': 0, 'type': 'assertion', 'mode': 'automatic', 'result': 1.0}], [<SOAPpy.Types.structType item at 140493353171712>: {'column': 1, 'line': 0, 'type': 'assertion', 'mode': 'automatic', 'result': 0.0}] Det er her vi sitter fast. Vi ønsker å hente ut nøkkelen 'result' og valuen til 'result'. Altså, feks: EGOVMON.PDF.03 result: 1.0 WCAG.PDF.14 result: 0.0 Noen som kan hjelpe til med dette?
snippsat Skrevet 2. mai 2014 Skrevet 2. mai 2014 (endret) Tips startswith() kan ta tuple for flere argumenter. >>> d = {'EGOVMON.CRE.1.2': 1, 'EGOVMON.PDF.03': 2, 'EGOVMON.PDF.05': 3, 'WCAG.PDF.14': 4, 'EGOVMON.TITLE.1.2': 5} >>> for key, value in d.iteritems(): if key.startswith(('EGOVMON.PDF.03', 'WCAG.PDF')): print '{} --> {}'.format(key, value) WCAG.PDF.14 --> 4 EGOVMON.PDF.03 --> 2 Når det gjelder verdier du får ut,så er jeg ikke sikker om det en liste med dictionary eller kanskje et par dictionary i listen. Verdier tar du på denne på denne måten. >>> value_lst [['<SOAPpy.Types.structType item at 140493364567432>:', {'column': 1, 'line': 0, 'mode': 'automatic', 'result': 1.0, 'type': 'assertion'}], ['<SOAPpy.Types.structType item at 140493353171712>:', {'column': 1, 'line': 0, 'mode': 'automatic', 'result': 0.0, 'type': 'assertion'}]] >>> value_lst[0][1]['result'] 1.0 >>> value_lst[0][1]['result'] 0.0 #eller value_lst_1[0][0]['<SOAPpy.Types.structType item at 140493364567432>']['result'] 1.0 Dette er usikkert da jeg ikke vet helt hvordan original dicionary ser ut. Du kan jo prøve og og forandre print linjen i koden min over til dette når du bruker eget dict. Eller prøve siste resultat av value_lst_1. print '{} --> {}'format(key, '\n'.join(str(value_lst[index][1]['result']) for index, value in enumerate(value_lst))) Endret 2. mai 2014 av snippsat 1
Muffinss Skrevet 11. mai 2014 Forfatter Skrevet 11. mai 2014 Viste seg at det var et array i dictionary. Veldig forvirrende greier. Har enda et spørsmål rundt dette, hentet fra stackoverflow: SOAPpy er involvert. need some help with a loop in python. ll = ['EGOVMON.PDF.03', 'WCAG.PDF.14', 'WCAG.PDF.16', 'WCAG.PDF.04', 'WCAG.PDF.02'] res['WCAG.PDF.01'] = [<SOAPpy.Types.structType item at 140559206366096>: {'column': 3, 'line': 0, 'type': 'assertion', 'mode': 'automatic', 'result': 1.0}, <SOAPpy.Types.structType item at 140559206366528>: {'column': 10, 'line': 0, 'type': 'assertion', 'mode': 'automatic', 'result': 1.0}] The loop: failed = 0 passed = 0 for k in ll: if res[k][0]['result'] == 1: failed = failed + 1 elif res[k][0]['result'] == 0: passed = passed + 1 In this case the index value of 'result' is [0]. However in some other cases (for instance: res['WCAG.PDF.01']), the values would be as such: res[k][0]['result'] = 1.0 res[k][1]['result'] = 1.0 So my question is how do I increase the value in my loop? I've tried this: failed = 0 passed = 0 x = 0 for k in ll: if res[k][x]['result'] == 1: failed = failed + 1 x = x + 1 failed = failed + 1 elif res[k][0]['result'] == 0: passed = passed + 1 I know this is not correct... What I'm trying to achieve is to count all the failed tests in a SOAPpy call. So if 'result' == 1.0, it is a failed test. Because my first loop only counts the [0]'result', the others won't be counted.
snippsat Skrevet 11. mai 2014 Skrevet 11. mai 2014 (endret) Bruk collections.Counter,husk intendering når du poster Python kode. from collections import Counter lst = [['<SOAPpy.Types.structType item at 140493364567432>:', {'column': 1, 'line': 0, 'mode': 'automatic', 'result': 1.0, 'type': 'assertion'}], ['<SOAPpy.Types.structType item at 140493353171712>:', {'column': 1, 'line': 0, 'mode': 'automatic', 'result': 0.0, 'type': 'assertion'}]] print Counter(item[1]['result'] for item in lst) #--> Counter({0.0: 1, 1.0: 1}) Endret 11. mai 2014 av snippsat 1
Muffinss Skrevet 11. mai 2014 Forfatter Skrevet 11. mai 2014 Uu, dette skal sjekkes ut. Bruk collections.Counter, husk intendering når du poster Python kode. Det forsvant litt i kopieringa fra stackoverflow, beklager det.
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå