Zählelemente im Wörterbuch

Ich muss die verschiedenen IDENTIFIERS zählen und eine Anzahl Anzahl für sie ausdrucken. Die Informationen stammen aus einem Datenstrom, der so aussieht:

IDENTIFIER 7756753.940 receivetest: ms 0x0000069a 8 00 00 00 00 00 e4 8a 9a 7756754.409 receivetest: ms 0x00000663 8 2f 00 62 02 00 e4 8a 9a 7756754.878 receivetest: ms 0x0000069e 8 00 1f 5e 28 34 83 59 1a 7756755.348 receivetest: ms 0x00000690 8 00 18 00 28 34 83 59 1a 7756853.908 receivetest: ms 0x0000069a 8 00 00 00 00 00 e4 8a 9a 7756854.377 receivetest: ms 0x0000069e 8 00 1f 5e 28 34 83 59 1a 7756854.846 receivetest: ms 0x00000663 8 2f 00 62 02 00 e4 8a 9a 7756855.316 receivetest: ms 0x00000690 8 00 18 00 28 34 83 59 1a 7756953.961 receivetest: ms 0x0000069a 8 00 00 00 00 00 e4 8a 9a 7756954.430 receivetest: ms 0x00000663 8 2f 00 62 02 00 e4 8a 9a 7756954.857 receivetest: ms 0x0000069e 8 00 1f 5e 28 34 83 59 1a 7756955.326 receivetest: ms 0x00000690 8 00 18 00 28 34 83 59 1a 7757053.929 receivetest: ms 0x0000069a 8 00 00 00 00 00 e4 8a 9a 7757054.398 receivetest: ms 0x00000663 8 2f 00 62 02 00 e4 8a 9a 7757054.868 receivetest: ms 0x0000069e 8 00 1f 5e 28 34 83 59 1a 7757055.337 receivetest: ms 0x00000690 8 00 18 00 28 34 83 59 1a 7757153.940 receivetest: ms 0x0000069a 8 00 00 00 00 00 e4 8a 9a 7757154.409 receivetest: ms 0x00000663 8 2f 00 62 02 00 e4 8a 9a 7757154.878 receivetest: ms 0x0000069e 8 00 1f 5e 28 34 83 59 1a 7757155.348 receivetest: ms 0x00000690 8 00 18 00 28 34 83 59 1a 7757227.369 receivetest: ms 0x00000688 8 00 00 00 00 00 00 00 00 

Hier ist mein Code:

 #!/usr/bin/python import subprocess import re, os, pprint DICT = {} def RECEIVE(COMMAND): PROCESS = subprocess.Popen(COMMAND, stdout=subprocess.PIPE) LINES = iter(PROCESS.stdout.readline, "") for LINE in LINES: if re.match(r"^\d+.*$",LINE): SPLITLINE = LINE.split() del SPLITLINE[1:4] TIMER = SPLITLINE[0] IDENTIFIER = SPLITLINE[1] DLC = SPLITLINE[2] HEXBITS = SPLITLINE[3:] COUNTER = DICT.count(IDENTIFIER) DICT[IDENTIFIER] = [DLC, HEXBITS, TIMER[6:], COUNTER] for IDENTIFIER, HEXBITS in DICT.items(): os.system("clear") pprint.pprint(DICT) RECEIVE(["receivetest", "-f=/dev/pcan33"]) 

Ich brauche nur die Anzahl der Zeiten zu drucken, in denen IDENTIFIER gelesen wurde

4 Solutions collect form web for “Zählelemente im Wörterbuch”

Sie können collections.Counter , aber ein collections.defaultdict wird für diesen Fall ausreichen:

 from collections import defaultdict def RECEIVE(COMMAND): counts = defaultdict(int) # <your code> IDENTIFIER = SPLITLINE[1] counts[IDENTIFIER] += 1 # <rest of your code> # <whenever you want to see how many times some identifier has appeared> print(counts[SOME_IDENTIFIER]) 

Sie könnten natürlich auch einfache Gnu-Werkzeuge verwenden

 receivetest -f=/dev/pcan33 | cut -f 5 | uniq | wc -l 

Aber wenn Sie darauf bestehen, Python zu benutzen …

 identifiers = set(line.split()[4] for line in lines) 

Wenn du nur ein Wörterbuch willst, um Objekte zu zählen, kannst du so etwas machen:

 id_count = {} def recieve(): # insert your subprocess and read here, change the loop for line in identifiers.split('\n'): if re.match(r"^\d+.*$",line): identifier = line.split()[4] if identifier in id_count.keys(): id_count[identifier] += 1 else: id_count[identifier] = 1 

Danach können Sie drucken oder auf das Dict zugreifen, um zu sehen, wie oft Sie jede Kennung erhalten haben

 >>> DICT = {} >>> for LINE in LINES: ... SPLITLINE = LINE.split() ... try: ... DICT[SPLITLINE[4]] = DICT[SPLITLINE[4]] + 1 ... except: ... DICT[SPLITLINE[4]] = 1 ... >>> DICT {'0x0000069a': 5, '0x00000690': 5, '0x00000688': 1, '0x00000663': 5, '0x0000069e': 5} 
Python ist die beste Programmiersprache der Welt.