2017-08-10 4 views
0

Ich habe die folgende Funktion, die ich verwendet, um die Länge der Orte in einer binären Zahl zu finden, wo Nullen durch Einsen eingekapselt sind:Python Grund String Split-Methode Verhalten

def solution(N): 
# write your code in Python 2.7 
# convert to binary 
binary = bin(N)[2:] # results prefixed with '0b' 
# special case of no zeros 
if '0' not in str(binary): 
    print('No binary gap in %s'% str(binary)) 
    return 0 
# special case of all zeros after first 1 
if '1' not in str(binary)[1:]: 
    print('No binary gap in %s'% str(binary)) 
    return 0 
# special case of N == 1 = 01 
if N == 1: 
    print('No binary gap in %s'% str(binary)) 
    return 0 

bgaps = [] 
sbin = str(binary) 
print(sbin) 
spbin = sbin.split('1') 
print(spbin) 
for i in spbin: 
    if i == '': continue 
    bgaps.append(len(i)) 

return max(bgaps) 

for N in [6,328,147,15,2,483,647]: 
    print(solution(N) 

Die Ergebnisse dieser Zeichenfolge Split zeigen doesn‘ t immer eine '', wo das Trennzeichen verwendet wurde. Das passiert z.B. für 101001000 wo die Spaltung zurück

['', '0', '00', '000'] 

statt

['', '0','', '00', '', '000'] 

Ich vermute, dass dies mit einer besonderen Bedeutung von ‚01‘ zu tun hat, sondern das Trennzeichen ist ‚1‘. Irgendwelche Gedanken darüber, warum diese Trennung sich so verhält?

+1

dies ist nicht 2.7 – Mangohero1

+1

'Split' wirft das Trennzeichen weg:' "a, b, c" .split (',') == ["a", "b", "c"] '. – ForceBru

Antwort

2

aktualisieren hinzugefügt Ausnahme, wenn letzte Element ein 1.

ist

Wie wäre es die „1“ mit „11“ ersetzt einen leeren Raum Hinzufügen zwischen.

sbin = '10100100' 

if sbin[-1] == "1": 
    print(sbin.replace("1","11").split("1")[1:-1]) # remove first and last 
else: 
    print(sbin.replace("1","11").split("1")[1:]) # remove first 

druckt

['', '0', '', '00', '', '000'] 
+0

Eine interessante Lösung :-) – Shejo284

4

Sie scheinen zu missverstehen, wie str.split funktioniert. Da 1 am Anfang der Zeichenfolge steht, wird die leere Zeichenfolge auf der linken Seite der Teilung am Startzeichen angezeigt. str.split setzt diese in consdiration:

>>> '1'.split('1') 
['', ''] 

Sieht aus wie Sie wollen nicht gespalten.

Sie wollen wahrscheinlich etwas von der Art:

>>> from itertools import groupby 
>>> sbin = '101001000' 
>>> ['' if k=='1' else ''.join(g) for k, g in groupby(sbin)] 
['', '0', '', '00', '', '000'] 
+0

Ich wollte auch eine Lösung mit 'groupby' posten, aber es scheint, als ob das OP Hausaufgaben macht, in welchem ​​Fall das Benutzen von etwas wie' gropuby' wahrscheinlich als Betrug betrachtet würde. Vielleicht auch eine handgewalzte Lösung? –

+0

@ChristianDean Ich habe hinzugefügt, dass, da sie einige Mühe gezeigt haben, den größeren Teil 'alleine' zu arbeiten :) –

+0

In Ordnung, ich schätze, ich sehe deine Logik. fair genug ;-) –

2

Wie @ForceBru erwähnt, entfernt Split das Trennzeichen, das das gleiche Verhalten in vielen Sprachen ist. Wahrscheinlich möchtest du das anders angehen (vielleicht mit einer Kombination aus Teilen + Ersetzen oder etwas Ähnlichem, um die Lücken zu zählen).

Hoffnung, die einen Einblick gibt.