Muffinss Skrevet 2. mai 2014 Del 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? Lenke til kommentar
snippsat Skrevet 2. mai 2014 Del 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 Lenke til kommentar
Muffinss Skrevet 11. mai 2014 Forfatter Del 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. Lenke til kommentar
snippsat Skrevet 11. mai 2014 Del 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 Lenke til kommentar
Muffinss Skrevet 11. mai 2014 Forfatter Del 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. Lenke til kommentar
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å