Строка всех символов в двойном цикле в Python - PullRequest
2 голосов
/ 02 сентября 2011

У меня есть следующий код Python, который циклически перебирает строку и использует каждый символ с заглавной буквы:

str = 'abcd'
l  = list(str)
for i in range(len(l)):
    rl = list(str)
    cap_char = l[i].capitalize()
    rl[i] = cap_char
    str1 = ''.join(rl)
    print str1

, который выдает:

Abcd aBcd abCd abcD

Я хотел бы усовершенствовать этот код, чтобы увеличивать количество последовательных символов, подлежащих заглавным буквам, до тех пор, пока это число не достигнет len (l) - 1, чтобы получить:

Abcd aBcd abCd abcD    >> - 1 char capitalized
ABcd aBCd abCD AbcD    >> - 2 chars capitalized
ABCd aBCD AbCD ABcD    >> - 3 chars capitalized

Я сталкиваюсь с "индексом изошибки диапазона, когда я делаю арифметику с индексом, понимаю, что идентификаторы должны переноситься, но не может создать элегантный код; (

Ответы [ 3 ]

3 голосов
/ 02 сентября 2011
import itertools
x = 'abcd'
n = len(x)
for i in xrange(1,n):
  combinations = itertools.combinations(range(n), i)
  for c in combinations:
    print ''.join([k if m not in c else k.upper() for m,k in enumerate(x)]),
  print '    >> - {0} char(s) capitalized'.format(i)

Выход:

Abcd aBcd abCd abcD     >> - 1 char(s) capitalized
ABcd AbCd AbcD aBCd aBcD abCD     >> - 2 char(s) capitalized
ABCd ABcD AbCD aBCD     >> - 3 char(s) capitalized
2 голосов
/ 02 сентября 2011

В зависимости от вашего ответа на вопрос wim, вы либо хотите ответ wim , либо это:

>>> def upper_case(str_, start, end):
...  substr = str_[start:end].upper()
...  return str_[:start] + substr + str_[end:]
... 
>>> def raise_combinations(str_, length):
...  for x in xrange(len(str_) - length + 1):
...   print(upper_case(str_, x, x + length))
... 
>>> raise_combinations('abcdefghi', 1)
Abcdefghi
aBcdefghi
abCdefghi
abcDefghi
abcdEfghi
abcdeFghi
abcdefGhi
abcdefgHi
abcdefghI
>>> raise_combinations('abcdefghi', 4)
ABCDefghi
aBCDEfghi
abCDEFghi
abcDEFGhi
abcdEFGHi
abcdeFGHI

РЕДАКТИРОВАТЬ: И, конечно, если вы хотите повторить это:

>>> str_ = "abcd"
>>> for x in xrange(1, len(str_) + 1):
...  raise_combinations(str_, x)
... 
Abcd
aBcd
abCd
abcD
ABcd
aBCd
abCD
ABCd
aBCD
ABCD
>>> 
2 голосов
/ 02 сентября 2011

использовать оператор по модулю при вычислении номера индекса:

idx = idx % len(str)

Кстати, не используйте str в качестве допустимого имени в python. Чтобы понять почему, попробуйте это:

print str(4)
str = 'foo'
print str(4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...