Ітэрацыя і індэксаванне

У цяперашні час я затрымаўся з гэтай праграмай. Я спрабую вызначыць малекулярную масу злучэння дадзенага малекулярнае раўнанне (толькі Cs, Hs і Os). Я таксама ўпэўнены ў тым, як правільна фарматаваць [індэкс +1], як я спрабую вызначыць, што наступны знак пасля «х», каб убачыць, калі гэта лік або іншая малекула

Абарона асноўныя ():

C1 = 0
H1 = 0
O1 = 0
num = 0

chemicalFormula = input("Enter the chemical formula, or enter key to quit: ")
while True:
    cformula = list(chemicalFormula)
    for index, x in enumerate(cformula):
        if x == 'C':
            if cformula[index + 1] == 'H' or cformula[index + 1] == 'O':
                C1 += 1
            else:
                for index, y in range(index + 1, 1000000000):
                    if cformula[index + 1] != 'H' or cformula[index + 1] != 'O':
                        num = int(y)
                        num = num*10 + int(cformula[index + 1])
                    else:
                        C1 += num
                        break

гэта памылка я атрымліваю

Enter the chemical formula, or enter key to quit: C2
  File "/Users/ykasznik/Documents/ykasznikp7.py", line 46, in main
    for index, y in range(index + 1, 1000000000):
TypeError: 'int' object is not iterable
>>> 
2
Я не разумею, чаму вы карыстаецеся дыяпазон (індэкс + 1, 1000000000) . Ці вы хочаце, магчыма неабмежаваную ітэрацыю, і вы павінны выкарыстоўваць itertools.count (індэкс + 1) ці вы хочаце перабраць да даўжыні формулы: дыяпазон (індэкс + 1, даўжыня (cformula)) . Выбар выпадковага вялікай колькасці дрэнная ідэя і можа выклікаць IndexError с.
дададзена аўтар Bakuriu, крыніца
Я не разумею, чаму вы карыстаецеся дыяпазон (індэкс + 1, 1000000000) . Ці вы хочаце, магчыма неабмежаваную ітэрацыю, і вы павінны выкарыстоўваць itertools.count (індэкс + 1) ці вы хочаце перабраць да даўжыні формулы: дыяпазон (індэкс + 1, даўжыня (cformula)) . Выбар выпадковага вялікай колькасці дрэнная ідэя і можа выклікаць IndexError с.
дададзена аўтар Bakuriu, крыніца
Я не разумею, чаму вы карыстаецеся дыяпазон (індэкс + 1, 1000000000) . Ці вы хочаце, магчыма неабмежаваную ітэрацыю, і вы павінны выкарыстоўваць itertools.count (індэкс + 1) ці вы хочаце перабраць да даўжыні формулы: дыяпазон (індэкс + 1, даўжыня (cformula)) . Выбар выпадковага вялікай колькасці дрэнная ідэя і можа выклікаць IndexError с.
дададзена аўтар Bakuriu, крыніца
Якая мэта ўнутранага цыкла?
дададзена аўтар Janne Karila, крыніца
TypeError вы атрымліваеце, таму што Python спрабуе перабіраць адзін міжнар для прысваення значэнняў двух імёнаў. Гэта называецца «картэж распакаванне» і з'яўляецца часткай таго, чаму а, Ь = Ь, а гэта правільны Python для замены значэнняў імёнаў.
дададзена аўтар pcurry, крыніца
TypeError вы атрымліваеце, таму што Python спрабуе перабіраць адзін міжнар для прысваення значэнняў двух імёнаў. Гэта называецца «картэж распакаванне» і з'яўляецца часткай таго, чаму а, Ь = Ь, а гэта правільны Python для замены значэнняў імёнаў.
дададзена аўтар pcurry, крыніца
TypeError вы атрымліваеце, таму што Python спрабуе перабіраць адзін міжнар для прысваення значэнняў двух імёнаў. Гэта называецца «картэж распакаванне» і з'яўляецца часткай таго, чаму а, Ь = Ь, а гэта правільны Python для замены значэнняў імёнаў.
дададзена аўтар pcurry, крыніца
Дзе менавіта вы маеце намер у з ва ўнутраным цыкле не зразумела - гэта, вядома, не з дыяпазон() . Ачыстка, што да дазволіць даць больш дакладны адказ.
дададзена аўтар kampu, крыніца
Дзе менавіта вы маеце намер у з ва ўнутраным цыкле не зразумела - гэта, вядома, не з дыяпазон() . Ачыстка, што да дазволіць даць больш дакладны адказ.
дададзена аўтар kampu, крыніца

12 адказы

Вы павінны змяніць гэты радок

for index, y in range(index + 1, 1000000000):

у

for y in range(index + 1, 1000000000):
2
дададзена
Вы, напэўна, хацеў сказаць: "Вы павінен змена ...".
дададзена аўтар Bakuriu, крыніца
@Bakuriu Дзякуй, выпраўлена.
дададзена аўтар Roger, крыніца

Вы павінны змяніць гэты радок

for index, y in range(index + 1, 1000000000):

у

for y in range(index + 1, 1000000000):
2
дададзена
Вы, напэўна, хацеў сказаць: "Вы павінен змена ...".
дададзена аўтар Bakuriu, крыніца
@Bakuriu Дзякуй, выпраўлена.
дададзена аўтар Roger, крыніца

Вы павінны змяніць гэты радок

for index, y in range(index + 1, 1000000000):

у

for y in range(index + 1, 1000000000):
2
дададзена
Вы, напэўна, хацеў сказаць: "Вы павінен змена ...".
дададзена аўтар Bakuriu, крыніца
@Bakuriu Дзякуй, выпраўлена.
дададзена аўтар Roger, крыніца

Вось мая ідэя аб тым, як вырашыць гэтую праблему. У прынцыпе, вы сачыць за бягучым станам «» і перабіраць кожны знак роўна адзін раз, так што вы не можаце страціць адсочваць, дзе вы або што-небудзь падобнае.

def getWeightFromChemical(chemical):
    chemicals = {"C" : 6, "H" : 1, "O" : 8}
    return chemicals.get(chemical, 0)

def chemicalWeight(chemicalFormula):
    lastchemical = ""
    currentnumber = ""
    weight = 0

    for c in chemicalFormula:
        if str.isalpha(c): # prepare new chemical
            if len(lastchemical) > 0:
                weight += getWeightFromChemical(lastchemical)*int("1" if currentnumber == "" else currentnumber)
            lastchemical = c
            currentnumber = ""
        elif str.isdigit(c): # build up number for previous chemical
            currentnumber += c

    # one last check
    if len(lastchemical) > 0:
        weight += getWeightFromChemical(lastchemical)*int("1" if currentnumber == "" else currentnumber)

    return weight

Дарэчы, можа хто-небудзь убачыць, як рэарганізаваць гэта не той кавалак кода ў два разы? Яна памылкі мне.

1
дададзена

Вось мая ідэя аб тым, як вырашыць гэтую праблему. У прынцыпе, вы сачыць за бягучым станам «» і перабіраць кожны знак роўна адзін раз, так што вы не можаце страціць адсочваць, дзе вы або што-небудзь падобнае.

def getWeightFromChemical(chemical):
    chemicals = {"C" : 6, "H" : 1, "O" : 8}
    return chemicals.get(chemical, 0)

def chemicalWeight(chemicalFormula):
    lastchemical = ""
    currentnumber = ""
    weight = 0

    for c in chemicalFormula:
        if str.isalpha(c): # prepare new chemical
            if len(lastchemical) > 0:
                weight += getWeightFromChemical(lastchemical)*int("1" if currentnumber == "" else currentnumber)
            lastchemical = c
            currentnumber = ""
        elif str.isdigit(c): # build up number for previous chemical
            currentnumber += c

    # one last check
    if len(lastchemical) > 0:
        weight += getWeightFromChemical(lastchemical)*int("1" if currentnumber == "" else currentnumber)

    return weight

Дарэчы, можа хто-небудзь убачыць, як рэарганізаваць гэта не той кавалак кода ў два разы? Яна памылкі мне.

1
дададзена

Адказы, тут сканцэнтраваны на двух розных аспектах вырашэння вашай праблемы:

  1. Вельмі канкрэтнае рашэнне для вашай памылкі ( Int ня итератора ), выпраўляючы код.
  2. Трохі больш у перспектыве, як апрацоўваць код.

Што тычыцца <�моцны> 1 , каментар да вашага пытання адзначыў пытанне: сінтаксіс картэжа-распакаванне ва ўнутраным цыкле. Прыклад картэжа распакаванні б

a,b = ['a','b']

Тут, Python б першы элемент правага боку (гарыць) і прысвоіць яго імя на левай баку (LHS), другі элемент гарыць і прысвоіць яго другое імя ў ЛХФ.

Ваш ўнутраны цыкл, разломы, <�Код> для індэкса, у ў дыяпазоне (індэкс + 1, 1000000000) , з'яўляецца эквівалентам спрабуе зрабіць

index, y = 1

Цяпер, цэлае не з'яўляецца сукупнасць элементаў, так што гэта не будзе працаваць.

Што тычыцца <�моцны> 2 , вы павінны засяродзіцца на стратэгіі модульнасці , які ў асноўным азначае, што вы пішаце функцыю для кожнага суб-праблемы. Python амаль народжаны для гэтага. (Звярніце ўвагу, што гэтая стратэгія не абавязкова азначае, што напісанне Python-модуляў для кожнага подзадачи.)

У вас выпадку, ваша галоўная мэта можа быць падзелена на некалькі подзадач:

    <�Літый> Атрыманне малекулярных паслядоўнасцяў.
  1. Падзяліць паслядоўнасці ў асобныя паслядоўнасці.
  2. <�Літый> Разбіццё паслядоўнасці ў яе Н, З, і О-элементы. <�Літый> З улікам колькасці H, C і O-атамаў, вылічыць малекулярны вага.

Крок 3 і 4 з'яўляюцца выдатнымі кандыдатамі для незалежных функцый, паколькі іх асноўная праблема ізаляваная ад астатняга кантэксту.

Тут, я мяркую, мы толькі атрымліваем 1 паслядоўнасць у той час, і што яны могуць быць у форме:

  • СН4
  • CHHHH
  • CP4H3OH

Крок 3:

def GetAtoms(sequence):
  ''' 
  Counts the number of C's, H's and O's in sequence and returns a dictionary.
  Only works with a numeric suffices up to 9, e.g. C10H12 would not work.
  '''
  atoms = ['C','H','O']  # list of which atoms we want to count.
  res = {atom:0 for atom in atoms}
  last_c = None
  for c in sequence:
    if c in atoms:
      res[c] += 1
      last_c = c
    elif c.isdigit() and last_c is not None:
      res[last_c] += int(c) - 1
      last_c = None
    else:
      last_c = None
   return res

Вы можаце бачыць, што незалежна ад таго, як вы атрымаеце паслядоўнасць, і як разлічваецца малекулярны вага, гэты метад працуе (пры перадумовах). Калі ў далейшым неабходна пашырыць магчымасці як атрымаць атам-рахунак, гэта можа быць зменена, не закранаючы астатнюю логіку.

Крок 4:

def MolecularWeight(atoms):
  return atoms['H']*1 + atoms['C']*8 + atoms['O']*18

Зараз ваша агульная логіка можа быць такі:

while True:
  chemicalFormula = input("Enter the chemical formula, or enter key to quit: ")
  if len(chemicalFormula) == 0:
    break

  print 'Molecular weight of', chemicalFormula, 'is', MolecularWeight(GetAtoms(chemicalFormula))
1
дададзена
адрозненне паміж некалькімі малекуламі было тое, што спатыкнуўся мяне ўвесь гэты час
дададзена аўтар Yotam Kasznik, крыніца
ў парадку, так што я проста паспрабаваў пакласці ўсё гэта разам, і я па-ранейшаму патрэбен першыя крокі ха-ха ... любыя прапановы па напрамках для першых двух?
дададзена аўтар Yotam Kasznik, крыніца
Ух ты, ты выратавальнік. Я збіраюся паспрабаваць і выкарыстоўваць гэты адказ, каб дапамагчы мне вырашыць гэтую праблему. Я не хачу гучаць наперад/ісці супраць этыкету, але калі я проста капіяваць/ўставіць ўсе гэтыя асобныя часткі пад адной асноўнай у маім акне будзе яго запусціць яго як функцыю? яшчэ раз, сапраўды пачатковец у Python і выхад з маёй лігі прама цяпер
дададзена аўтар Yotam Kasznik, крыніца
Таксама разгледзім наступныя кадавальныя прынцыпы Python ў PEP8 . У прыватнасці, метады і функцыі пачынаюцца з знака ў ніжнім рэгістры, дзе імёны класаў пачынаюцца з знака верхняга рэгістра і знаходзяцца ў CamelCase.
дададзена аўтар pcurry, крыніца
Што вы чакаеце ў якасці ўваходных дадзеных ад карыстальніка, і вы чакаеце толькі адну малекулы за ўваход або некалькі малекул на ўваход? У выпадку некалькіх малекул, як вы адрозніваць асобныя малекулы?
дададзена аўтар MrGumble, крыніца
Гэта халаднаватая частка; калі ў вас ёсць Асноўны -Функцыя, то гэтыя два вызначэння метаду не павінны быць <�я> у клавішы Асноўны -Функцыя, але могуць быць вызначаны да або пасля гэтага! Гэта толькі апошні кодоблок ( у той час як True: ... ), які будзе знаходзіцца ў вашым Асноўны -Функцыя.
дададзена аўтар MrGumble, крыніца

Адказы, тут сканцэнтраваны на двух розных аспектах вырашэння вашай праблемы:

  1. Вельмі канкрэтнае рашэнне для вашай памылкі ( Int ня итератора ), выпраўляючы код.
  2. Трохі больш у перспектыве, як апрацоўваць код.

Што тычыцца <�моцны> 1 , каментар да вашага пытання адзначыў пытанне: сінтаксіс картэжа-распакаванне ва ўнутраным цыкле. Прыклад картэжа распакаванні б

a,b = ['a','b']

Тут, Python б першы элемент правага боку (гарыць) і прысвоіць яго імя на левай баку (LHS), другі элемент гарыць і прысвоіць яго другое імя ў ЛХФ.

Ваш ўнутраны цыкл, разломы, <�Код> для індэкса, у ў дыяпазоне (індэкс + 1, 1000000000) , з'яўляецца эквівалентам спрабуе зрабіць

index, y = 1

Цяпер, цэлае не з'яўляецца сукупнасць элементаў, так што гэта не будзе працаваць.

Што тычыцца <�моцны> 2 , вы павінны засяродзіцца на стратэгіі модульнасці , які ў асноўным азначае, што вы пішаце функцыю для кожнага суб-праблемы. Python амаль народжаны для гэтага. (Звярніце ўвагу, што гэтая стратэгія не абавязкова азначае, што напісанне Python-модуляў для кожнага подзадачи.)

У вас выпадку, ваша галоўная мэта можа быць падзелена на некалькі подзадач:

    <�Літый> Атрыманне малекулярных паслядоўнасцяў.
  1. Падзяліць паслядоўнасці ў асобныя паслядоўнасці.
  2. <�Літый> Разбіццё паслядоўнасці ў яе Н, З, і О-элементы. <�Літый> З улікам колькасці H, C і O-атамаў, вылічыць малекулярны вага.

Крок 3 і 4 з'яўляюцца выдатнымі кандыдатамі для незалежных функцый, паколькі іх асноўная праблема ізаляваная ад астатняга кантэксту.

Тут, я мяркую, мы толькі атрымліваем 1 паслядоўнасць у той час, і што яны могуць быць у форме:

  • СН4
  • CHHHH
  • CP4H3OH

Крок 3:

def GetAtoms(sequence):
  ''' 
  Counts the number of C's, H's and O's in sequence and returns a dictionary.
  Only works with a numeric suffices up to 9, e.g. C10H12 would not work.
  '''
  atoms = ['C','H','O']  # list of which atoms we want to count.
  res = {atom:0 for atom in atoms}
  last_c = None
  for c in sequence:
    if c in atoms:
      res[c] += 1
      last_c = c
    elif c.isdigit() and last_c is not None:
      res[last_c] += int(c) - 1
      last_c = None
    else:
      last_c = None
   return res

Вы можаце бачыць, што незалежна ад таго, як вы атрымаеце паслядоўнасць, і як разлічваецца малекулярны вага, гэты метад працуе (пры перадумовах). Калі ў далейшым неабходна пашырыць магчымасці як атрымаць атам-рахунак, гэта можа быць зменена, не закранаючы астатнюю логіку.

Крок 4:

def MolecularWeight(atoms):
  return atoms['H']*1 + atoms['C']*8 + atoms['O']*18

Зараз ваша агульная логіка можа быць такі:

while True:
  chemicalFormula = input("Enter the chemical formula, or enter key to quit: ")
  if len(chemicalFormula) == 0:
    break

  print 'Molecular weight of', chemicalFormula, 'is', MolecularWeight(GetAtoms(chemicalFormula))
1
дададзена
адрозненне паміж некалькімі малекуламі было тое, што спатыкнуўся мяне ўвесь гэты час
дададзена аўтар Yotam Kasznik, крыніца
ў парадку, так што я проста паспрабаваў пакласці ўсё гэта разам, і я па-ранейшаму патрэбен першыя крокі ха-ха ... любыя прапановы па напрамках для першых двух?
дададзена аўтар Yotam Kasznik, крыніца
Ух ты, ты выратавальнік. Я збіраюся паспрабаваць і выкарыстоўваць гэты адказ, каб дапамагчы мне вырашыць гэтую праблему. Я не хачу гучаць наперад/ісці супраць этыкету, але калі я проста капіяваць/ўставіць ўсе гэтыя асобныя часткі пад адной асноўнай у маім акне будзе яго запусціць яго як функцыю? яшчэ раз, сапраўды пачатковец у Python і выхад з маёй лігі прама цяпер
дададзена аўтар Yotam Kasznik, крыніца
Таксама разгледзім наступныя кадавальныя прынцыпы Python ў PEP8 . У прыватнасці, метады і функцыі пачынаюцца з знака ў ніжнім рэгістры, дзе імёны класаў пачынаюцца з знака верхняга рэгістра і знаходзяцца ў CamelCase.
дададзена аўтар pcurry, крыніца
Гэта халаднаватая частка; калі ў вас ёсць Асноўны -Функцыя, то гэтыя два вызначэння метаду не павінны быць <�я> у клавішы Асноўны -Функцыя, але могуць быць вызначаны да або пасля гэтага! Гэта толькі апошні кодоблок ( у той час як True: ... ), які будзе знаходзіцца ў вашым Асноўны -Функцыя.
дададзена аўтар MrGumble, крыніца
Што вы чакаеце ў якасці ўваходных дадзеных ад карыстальніка, і вы чакаеце толькі адну малекулы за ўваход або некалькі малекул на ўваход? У выпадку некалькіх малекул, як вы адрозніваць асобныя малекулы?
дададзена аўтар MrGumble, крыніца

змена

for index, y in range(index + 1, 1000000000):

у

for index, y in enumerate(range(index + 1, 1000000000)):

Хаця вы можаце разгледзець перайменаванне вонкавага контуру або ўнутраны контуру Індэкс для яснасці

0
дададзена

Дыяпазон вяртае альбо спіс міжнар або итератор Інта, у залежнасці ад таго, якой версіі Python вы выкарыстоўваеце. Спроба прызначыць гэты адзіны Int ў двух імёнаў прымушае Python паспрабаваць перабіраць, што міжнар ў аўтаматызаваным картэжа распакаванні.

Такім чынам, зменіце

<�Код> для індэкса, у ў дыяпазоне (індэкс + 1, у):

у

<�Код> для г у дыяпазоне (індэкс + 1, у):

Also, you use index + 1 repeatedly, but mostly у look up the next symbol in your cformula. Since that doesn't change over the course of your outer loop, just assign it its own name once, and keep using that name:

for index, x in enumerate(cformula):
    next_index = index + 1
    next_symbol = cformula[next_index]
    if x == 'C':
        if next_symbol == 'H' or next_symbol == 'O':
            C1 += 1
        else:
            for y in range(next_index, 1000000000):
                if next_symbol != 'H' or next_symbol != 'O':
                    num = y*10 + int(next_symbol)
                else:
                    C1 += num
                    break

I've also refacуred out some constants у make the code cleaner. Your inner loop as written was failing on tuple assignment, and would only be counting up the y. Also, your index would be reset again once you exited the inner loop, so you would be processing all of your digits repeatedly.

If you want у iterate over the substring after your current symbol, you could just use slice notation у get all of those characters: for subsequent in cformula[next_index:]

Напрыклад:

>>> chemical = 'CH3OOCH3'
>>> chemical[2:]
'3OOCH3'
>>> for x in chemical[2:]:
...     print x
... 
3
O
O
C
H
3
0
дададзена
Дзякуй, ваш адказ быў вельмі карысным. Я цаню, што вы ачысткі мой код. Не маглі б вы расказаць крыху пра ітэрацыя падрадка? Падобна на тое, што мне трэба, ха-ха, але сумленна кажучы я вельмі новы з Python, так што я не зусім разумею, што гэта значыць
дададзена аўтар Yotam Kasznik, крыніца
Я працягнуў свой адказ з прыкладам выкарыстання лустачкі, каб атрымаць падрадок радкі, праз якую вы паўтараецца для.
дададзена аўтар pcurry, крыніца

Дыяпазон вяртае альбо спіс міжнар або итератор Інта, у залежнасці ад таго, якой версіі Python вы выкарыстоўваеце. Спроба прызначыць гэты адзіны Int ў двух імёнаў прымушае Python паспрабаваць перабіраць, што міжнар ў аўтаматызаваным картэжа распакаванні.

Такім чынам, зменіце

<�Код> для індэкса, у ў дыяпазоне (індэкс + 1, у):

у

<�Код> для г у дыяпазоне (індэкс + 1, у):

Also, you use index + 1 repeatedly, but mostly у look up the next symbol in your cformula. Since that doesn't change over the course of your outer loop, just assign it its own name once, and keep using that name:

for index, x in enumerate(cformula):
    next_index = index + 1
    next_symbol = cformula[next_index]
    if x == 'C':
        if next_symbol == 'H' or next_symbol == 'O':
            C1 += 1
        else:
            for y in range(next_index, 1000000000):
                if next_symbol != 'H' or next_symbol != 'O':
                    num = y*10 + int(next_symbol)
                else:
                    C1 += num
                    break

I've also refacуred out some constants у make the code cleaner. Your inner loop as written was failing on tuple assignment, and would only be counting up the y. Also, your index would be reset again once you exited the inner loop, so you would be processing all of your digits repeatedly.

If you want у iterate over the substring after your current symbol, you could just use slice notation у get all of those characters: for subsequent in cformula[next_index:]

Напрыклад:

>>> chemical = 'CH3OOCH3'
>>> chemical[2:]
'3OOCH3'
>>> for x in chemical[2:]:
...     print x
... 
3
O
O
C
H
3
0
дададзена
Дзякуй, ваш адказ быў вельмі карысным. Я цаню, што вы ачысткі мой код. Не маглі б вы расказаць крыху пра ітэрацыя падрадка? Падобна на тое, што мне трэба, ха-ха, але сумленна кажучы я вельмі новы з Python, так што я не зусім разумею, што гэта значыць
дададзена аўтар Yotam Kasznik, крыніца
Я працягнуў свой адказ з прыкладам выкарыстання лустачкі, каб атрымаць падрадок радкі, праз якую вы паўтараецца для.
дададзена аўтар pcurry, крыніца
for index, x in enumerate(cformula):
    if x == 'C':
        if cformula[index + 1] == 'H' or cformula[index + 1] == 'O':
            C1 += 1
        else:
            for index, y in range(index + 1, 1000000000):

Гэта сапраўды дрэнная ідэя. Вы перазапіс значэння індэкса ад знешняга контуру са значэннем індэкса з ўнутранага цыклу. Вы павінны выкарыстоўваць іншае імя, скажам, index2 для ўнутранага контуру.

Акрамя таго, калі вы кажаце для індэкса, у ў дыяпазоне (індэкс + 1, 1000000000): вы дзейнічаеце, як быццам вы чакаеце дыяпазону() для атрымання паслядоўнасці з 2-картэжаў. Але Дыяпазон заўсёды стварае паслядоўнасць Int с.

Роджэр прапанаваў для г у дыяпазоне (індэкс + 1, 1000000000): , але я думаю, што вы маюць намер атрымаць значэнне у аднекуль яшчэ (не ясна, дзе. можа быць, вы хочаце выкарыстоўваць другі аргумент перанумараваць() , каб паказаць значэнне, каб пачаць з, замест гэтага?

Гэта,     для index2, у ў Пералічоны (whereeveryoumeanttogetyfrom, індэкс + 1)

так што index2 роўны індэксе +1 на першым кроку праз пятлю, індэкс +2, на другім, і г.д.

0
дададзена
for index, x in enumerate(cformula):
    if x == 'C':
        if cformula[index + 1] == 'H' or cformula[index + 1] == 'O':
            C1 += 1
        else:
            for index, y in range(index + 1, 1000000000):

Гэта сапраўды дрэнная ідэя. Вы перазапіс значэння індэкса ад знешняга контуру са значэннем індэкса з ўнутранага цыклу. Вы павінны выкарыстоўваць іншае імя, скажам, index2 для ўнутранага контуру.

Акрамя таго, калі вы кажаце для індэкса, у ў дыяпазоне (індэкс + 1, 1000000000): вы дзейнічаеце, як быццам вы чакаеце дыяпазону() для атрымання паслядоўнасці з 2-картэжаў. Але Дыяпазон заўсёды стварае паслядоўнасць Int с.

Роджэр прапанаваў для г у дыяпазоне (індэкс + 1, 1000000000): , але я думаю, што вы маюць намер атрымаць значэнне у аднекуль яшчэ (не ясна, дзе. можа быць, вы хочаце выкарыстоўваць другі аргумент перанумараваць() , каб паказаць значэнне, каб пачаць з, замест гэтага?

Гэта,     для index2, у ў Пералічоны (whereeveryoumeanttogetyfrom, індэкс + 1)

так што index2 роўны індэксе +1 на першым кроку праз пятлю, індэкс +2, на другім, і г.д.

0
дададзена