2015-10-22 2 views
-3

Прочтите строку 1 и 0. Подсчитайте числа последовательных 1 и количество последовательных 0, до конца.Прочитайте строку 1 и 0. Считайте количество последовательных 1 и количество последовательных 0, до конца

Например,

s = "10001110000111" 

Вывод должен быть:

1 1's 
3 0's 
3 1's 
4 0's 
3 1's 

мне нужна помощь приближается к этому, используя только строковые функции (нет функции поиска), и время/для петель.

У меня есть это:

myString = input("Please enter a string of 0s and 1s: ") 
zeroCount = 0 
oneCount = 0 
index = 0 

while index < (len(myString) -1): 
    if myString[index] == "0": 
     zeroCount += 1 
     if myString[index +1] == "1": 
      zeroCount = 0 
    elif myString[index] == "1": 
     oneCount += 1 
     if myString[index +1] == "0": 
      oneCount = 0 
    index += 1 

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

+2

Добро пожаловать в переполнение стека! Кажется, вы просите кого-нибудь написать для вас какой-то код. Переполнение стека - это вопрос и ответ, а не служба написания кода. Пожалуйста, [см. Здесь] (http://stackoverflow.com/help/how-to-ask), чтобы узнать, как писать эффективные вопросы. –

ответ

3

Это очень похоже на то, что называется «запустить кодирования длины», которая имеет хороший вход на Rosettacode.org

def encode(input_string): 
    count = 1 
    prev = '' 
    lst = [] 
    for character in input_string: 
     if character != prev: 
      if prev: 
       entry = (prev,count) 
       lst.append(entry) 
       #print lst 
      count = 1 
      prev = character 
     else: 
      count += 1 
    else: 
     entry = (character,count) 
     lst.append(entry) 
    return lst 


def decode(lst): 
    q = "" 
    for character, count in lst: 
     q += character * count 
    return q 

#Method call 
encode("aaaaahhhhhhmmmmmmmuiiiiiiiaaaaaa") 
decode([('a', 5), ('h', 6), ('m', 7), ('u', 1), ('i', 7), ('a', 6)]) 

Я думаю, что вы будете в состоянии принять это и изменить его немного, чтобы сделать то, что вы хотите ,

0

Вы можете использовать метод index строки, чтобы найти следующую последовательность и обрезки исходной строки в каждом шаге:

s = "10001110000111" 

while s: 
    try: 
     count = s.index("0") if s[0] == "1" else s.index("1") 
     print("{} {}'s".format(count, s[0])) 
     s = s[count:] 
    except ValueError: 
     print("{} {}'s".format(len(s), s[0])) 
     break 
1

Если вы хотите отойти от методов чистого языка и использовать более идиоматический стиль, это это замечательное время для использования groupby, который берет вход и разбивает его на группы на основе того, когда ключевая функция возвращает другое значение. В этом случае ключевая функция - это просто значение, поэтому мы можем ее опустить.

import itertools 

s = "10001110000111" 
groups = itertools.groupby(s) 

groups теперь groupby итератор, который лениво вычисляет:

[('1', ['1']), 
('0', ['0', '0', '0']), 
('1', ['1', '1', '1']), 
('0', ['0', '0', '0', '0']), 
('1', ['1', '1', '1'])] 

Вы можете перебрать это увидеть:

for groupname, group in groups: 
    length = sum(1 for _ in group) 
    # group is not a list, it just acts like one, so we can't use len 
    print("{} {}'s".format(length, groupname)) 

Все вместе, это выглядит следующим образом:

import itertools 

s = "10001110000111" 
groups = itertools.groupby(s) 

for groupname, group in groups: 
    length = sum(1 for _ in group) 
    print("{} {}'s".format(length, groupname)) 

и возвращает результат

1 1's 
3 0's 
3 1's 
4 0's 
3 1's 
Смежные вопросы