2017-02-17 11 views
1

Задача состоит в том, чтобы взять целочисленный ввод от пользователя, преобразовать его в двоичный файл и напечатать максимальные последовательные вхождения 1 в двоичном представлении.Как печатать максимальные последовательные вхождения 1 в python 2.7?

Вот мой код:

import re 
x = int(raw_input()) 
y = bin(x)[2:] 
print "Binary of", x, "is =",y 
count = 0 
for i in re.findall('11', y): 
    count =+ 1 
print "Nb of consecutive 1's =", count 

вход I 13 и здесь выход я получаю:

Binary of 13 is = 1101 
Nb os consecutive 1's = 1 

я должен получать Nb из последовательных 1-х = 2.

Что я делаю неправильно?

+2

То, что вы делаете в это время, - это найти все времена, когда у вас есть «11». попробуйте двоичный код из 15, и вы увидите, что я говорю – RSon1234

+1

Я не знаю много о регулярном выражении, но я бы предположил, что то, что вы ищете, это вхождения '11', тогда в' 1101' есть только один. Вам нужно другое регулярное выражение. –

+0

Когда я делаю это для 15 (двоичный = 1111), я все равно получаю Nb последовательных 1s = 1 –

ответ

2

Вы должны сделать что-то вроде этого:

get_num_ones = re.findall(r"1+", y) 
print "Maximum Nb of consecutive 1's =", len(max(get_num_ones, key=len)) 

Что я здесь делаю, это получить все возможные подряд один находится в двоичную строку, а затем я выбираю строку с самой длинной длины.

+0

'sorted' (' O (n log n) '), чтобы получить одно значение? Возможно, вы хотите 'max' (' O (n) ')? – ShadowRanger

+0

Да, спасибо. @ShadowRanger – Jarvis

+0

@Jarvis Не могли бы вы объяснить раздел «key = len» в 'len (max (get_num_ones, key = len))' –

1

Обязательно groupby Функциональный один вкладыш.

from itertools import groupby 

print(max(map(lambda g: len(list(g[1])), filter(lambda a: a[0] == '1', groupby('1111101101101111111111111'))))) 

Использование GroupBy для разбиения строки в символы с тем же значением, как это не сортируется там будет несколько групп для несмежных множеств тех же символов. Затем filter выведите любые группы, которые не являются группами 1, и сопоставьте значения с длиной сгруппированных символов, наконец, получите самую большую из этих длин, используя max.

Не все, что можно прочитать на мой взгляд, но, тем не менее, интересно.

Если разбить на несколько строк, он может быть реализован как

maxlen = 0 
# group 
for grouper, group in groupby('1111101101101111111111111'): 
    # filter 
    if grouper == '1': 
     # map 
     thislen = len(list(group)) 
     # check max 
     if thislen > maxlen: 
      maxlen = thislen 

print(maxlen) 
+0

Я ценю новый подход, это кажется интересным. Хотя я был бы честен, я начинаю в Python, и я ищу что-то более простое, шаг за шагом, даже если код большой. –

+1

Я добавил сломанную версию, которую легче передернуть. –

+1

Sweet! Это стало более ясным. –

1

Вы можете split() строку на нули и max() полученный список подстрок, составленную только из «111»:

#!python3 

number = 32956415 
bits = bin(number)[2:] # bits = '1111101101101111111111111' 
         #  '....5..2..2.............13' 

print(bits) 
runs_of_ones = bits.split('0') 
longest_run = len(max(runs_of_ones, key=len)) 

print("Longest run is %d ones." % longest_run) 

 Смежные вопросы

  • Нет связанных вопросов^_^