2017-06-15 15 views
0

Ich habe eine Datei, die in jeweils einen Satz Zahlen wie diese Zeile enthält:Wie Hamming Gewicht für viele Zahlen in einer Datei berechnen?

[6 2 5 3 2 4] 
[6 2 5 3 2 4] 
[6 6 5 3 2 4] 
[2 6 5 3 2 4] 
[6 5 3 2 5 4] 
[6 5 3 2 5 4] 
[6 5 3 2 5 4] 
[6 5 3 2 5 3] 
........ 

I:

[222 9 217 21 65 197] 
[222 9 217 21 65 197] 
[222 207 217 21 65 197] 
[ 9 222 217 21 65 197] 
[222 117 21 65 217 197] 
[222 117 21 65 217 197] 
[222 117 21 65 217 197] 
[222 117 21 65 217 197] 
........ 

ich das Hamming-Gewicht jeder Zahl als Ergebnis möchte ich haben berechnet werden soll verwenden Sie dieses Skript, um die Hamming-Gewicht zu berechnen:

hw = [bin(x).count("1") for x in range(256)] 
print(hw[207]) 

Aber das kann ich nur eine Nummer für tun, Wie könnte ich das tun für die ganze Datei?

Könnte mir bitte helfen?

+0

Sie können für Schleifen in Liste Verständnis verschachtelt verwenden – Ding

Antwort

1

Sie könnte dies versuchen:

from io import StringIO 

text = '''[222 9 217 21 65 197] 
[222 9 217 21 65 197] 
[222 207 217 21 65 197] 
[ 9 222 217 21 65 197] 
[222 117 21 65 217 197] 
[222 117 21 65 217 197] 
[222 117 21 65 217 197] 
[222 117 21 65 217 197]''' 


def hw(number): 
    ret = 0 
    while number != 0: 
     ret += number & 1 
     number >>= 1 
    return ret 
    # might be faster: 
    # return bin(number).count('1') 

# with open(..., 'r') as file 
with StringIO(text) as file: 
    for line in file: 
     line = line.strip() 
     line = line.replace('[', '') 
     line = line.replace(']', '') 
     numbers = [int(n) for n in line.split()] 
     hws = [hw(n) for n in numbers] 
     print(hws) 

, um es für Sie arbeiten, entfernen Sie den text Teil oben, entfernen Sie die with StringIO(text) as file: Linie und ersetzen Sie es durch die with open(..., 'r') as file Linie. Sie müssen dort Ihren Dateinamen eingeben (oder besser: den vollständigen Pfad Ihrer Datei).

Ich habe auch eine andere Version des Hamminggewichts geliefert; basierend auf Bit-Operationen.

+0

Es ist auch möglich, die Zahlen mit einem regulären Ausdruck zu extrahieren, anstatt alle 'line' Manipulationen:' Zahlen = [int (n) für n in re.findall ('\ d +', Zeile)] 'oder direkt die' hws' als 'hws = [hw (int (n)) für n in re.findall ('\ d +', Zeile) ] '. – JohanL

0

Verwenden Sie für Schleifen, und Sie benötigen kein Listenverständnis.

def hamAll(seq): 
    output = [] 
    for i in seq: 
    output.append(bin(i).count("1")) 
    return output 

Schale:

>>> hamAll([1, 2, 3, 4, 5, 255]) 
...  #1 10 11 100 101 11111111 
[1, 1, 2, 1, 2, 8] 

Dann, wenn Sie wollen Eingabe eine Datei, würde ich re Modul verwenden.

import re 

def hamAll(seq): 
    output = [] 
    for i in seq: 
    output.append(bin(i).count("1")) 
    return output 

with open("filename.txt", 'r') as file: 
    inputf = file.read() 

inputf = re.sub(r"[\n\[\]]", " ", inputf) 
numbers = inputf.split(" ") 
hamReady = [] 
for i in numbers: 
    if i == "": 
    continue 
    if i.isdecimal(): 
    hamReady.append(int(i)) 

print(hamAll(hamReady)) 

Schale:

======== Restart: test.py ======== 
[6, 2, 5, 3, 2, 4, 6, 2, 5, 3, 2, 4, 6, 6, 5, 3, 2, 4, 2, 6, 5, 3, 2, 4, 6, 5, 3, 2, 5, 4, 6, 5, 3, 2, 5, 4, 6, 5, 3, 2, 5, 4, 6, 5, 3, 2, 5, 4] 
>>> 
0

I die Methode zur Berechnung des Hamming-Gewicht zu verwenden, entschieden, wie in dieser Antwort gefunden: https://stackoverflow.com/a/15540869/7938752

verwenden eine Kombination von für die Schleifen mit einigen Zeichenfolge Formatierungs um den Text aus der Eingabedatei zu extrahieren, die Zahlen zu extrahieren, das Hamming-Gewicht zu berechnen, die Zahlen neu zu formatieren, diese Zahlen auszudrucken und sie in eine Ausgabedatei zu schreiben.

Beispielcode:

def get_hm(x): 
    return bin(x).count("1") 

def format_numbers(results): 
    count = 0 
    result = "[" 
    for x in results: 
     if x >= 100: 
      result = result + str(x) 
     elif x >= 10: 
      result = result + " " + str(x) 
     else: 
      result = result + " " + str(x) 
     if count < len(results): 
      result = result + " " 
     count += 1 
    result = result + "]" 
    return result 

def get_numbers(line): 
    line = line.replace("[", "").replace("]","").replace("\n","") 
    results = [] 
    for x in line.split(" "): 
     if x != "" and x != " ": 
      results.append(get_hm((int(x)))) 
    return format_numbers(results) 


f = open("input.txt") 
y = f.readlines() 
for line in y: 
    print get_numbers(line) 
f.close() 

#optional code that writes the results to a file. 
f = open("output.txt", "w") 
for line in y: 
    f.write(get_numbers(line) + "\n") 
f.close() 
Verwandte Themen