Лучшее зацикливание, для работы со строками (python) - PullRequest
0 голосов
/ 02 марта 2010

Если у меня есть этот код

s = 'abcdefghi'
for grp in (s[:3],s[3:6],s[6:]):
    print "'%s'"%(grp)

    total = calc_total(grp)

    if (grp==s[:3]):
        # more code than this
        p = total + random_value
        x1 = my_function(p)

    if (grp==s[3:6]):
        # more code than this
        p = total + x1
        x2 = my_function(p)

    if (grp==s[6:]):
        # more code than this
        p = total + x2
        x3 = my_function(p)

Если группа является первой группой, выполните код для этой группы, если группа является второй группой, выполните код, используя значение, сгенерированное из кода, выполненного для первой группы, то же самое относится и к третьей группе, используя сгенерированное значение из кода для второй группы:

Как я могу привести это в порядок, чтобы использовать лучшие циклы?

Спасибо

Ответы [ 5 ]

3 голосов
/ 02 марта 2010

Возможно, я неправильно понял, что вы делаете, но похоже, что вы хотите сделать что-то с s [: 3] на первой итерации, что-то отличное от s [3: 6] на второй, и снова что-то еще с [6:] на третьем. Другими словами, это вовсе не петля! Просто напишите эти три блока кода один за другим, используя s [: 3] и т. Д. Вместо grp.

1 голос
/ 11 апреля 2012

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

s = 'abcdefghi'

def foo(grp):
    # Anything more you would like to happen over and over again
    print "'%s'"%(grp)
    return calc_total(grp)

def bar(grp, value):
    total = foo(grp)
    # more code than this
    return my_function(total + value)

x1 = bar(s[:3], random_value)
x2 = bar(s[3:6], x1)
x3 = bar(s[6:], x2)

Если

    # more code than this

содержит не повторяющийся код, тогда вы, конечно, должны убрать его из "bar" (которому вместе с "foo" должно быть дано более описательное имя).

0 голосов
/ 02 марта 2010

Получите данные в нужный список, затем попробуйте следующее:

output = 0
seed = get_random_number()
for group in input_list:
    total = get_total(group)
    p = total + seed
    seed = my_function(p)

input_list должно выглядеть как ['abc', 'def', 'ghi']. Но если вы хотите расширить его до ['abc','def','ghi','jkl','mno','pqr'], это все равно должно работать.

0 голосов
/ 02 марта 2010

Я бы написал что-то вроде этого:

for i, grp in enumerate((s[:3],s[3:6],s[6:])):
    print "'%s'"%(grp)

    total = calc_total(grp)
    # more code that needs to happen every time

    if i == 0:
        # code that needs to happen only the first time
    elif i == 1:
        # code that needs to happen only the second time

и т.д.. Проверки == могут вводить в заблуждение, если одна из групп "просто так" совпадает с другой, в то время как подход enumerate не представляет такого риска.

0 голосов
/ 02 марта 2010
x = reduce(lambda x, grp: my_function(calc_total(list(grp)) + x),
        map(None, *[iter(s)] * 3), random_value)

В конце у вас будет последний x.

Или, если вы хотите сохранить промежуточные результаты,

x = []
for grp in map(None, *[iter(s)] * 3):
    x.append(my_function(calc_total(list(grp)) + (x or [random_value])[-1]))

Тогда у вас есть x[0], x[1], x[2].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...