是否可以重复循环的迭代?

时间:2010-07-13 14:19:19

标签: python for-loop

我已经定义了一个for循环,如下所示,它扫描一个由两列组成的文件,当它找到关键字DEFINE_MENU时,该行的第二列引用了一个屏幕的标题。关键字的下一个实例将为单独的屏幕定义标题,依此类推到第n个屏幕。目前,代码能够定义第一个菜单标题。

是否有可能,当我到达关键字DEFINE_MENU的第二个实例重复同一行的循环时,设置title_flag = 0从而重复自身,捕获第二个菜单标题?

def getInfo():

    title_flag = 0
    number = 1
    menus = {}
    items = {}
    title = None
    file = open('some_file', 'r')
    for line in file:
        # Test for comments, if they exist pass and move on
        if line[0] == '#':
            continue
        # Hop over blank lines
        if re.search(r'^\s+$', line):
            continue
        # Find the line where the title is defined
        if re.search('DEFINE_MENU', line) and title_flag == 0:
            type, name = line.split()
            title = name
            title_flag = 1
            continue
        # If DEFINE_MENU is found and flag has been raised, this
        # signifies a new menu definition so break.
        if re.search('DEFINE_MENU', line) and title_flag == 1:
            break
        if re.search('PRIV', line):
            (type, name, priv_holder, *description) = line.split()
        else:
            (type, name, *description) = line.split()
        # If flag has been raised, the line must follow the definition
        # of the menu, it must contains info regarding a menu item.
        if title_flag == 1:
            description = ' '.join(description)
            items[str(number)] = name
            number += 1
    file.close()
    menus[title] = items
    return menus

感谢您的投入!

汤姆

编辑:首先,为造成的混乱道歉。也许我认为问题比我想象的更简单,并且提供的信息少于要求。我将深入研究,我使用的输入文件格式为:

# MENU TYPE     NAME            PRIV?   DESCRIPTION
DEFINE_MENU     CRAGINS
MENU            menu_name1              This takes you to menu 1
MENU            menu_name2              This takes you to menu 2
VARIABLE        var_name1               Alter variable1
VARIABLE        var_name2       PRIV    Alter variable1
COMMAND         command1                Perform command1
DEFINE_MENU     MENU2
MENU            menu_name3              This takes you to menu 3
MENU            menu_name4              This takes you to menu 4
VARIABLE        var_name3               Alter variable3
VARIABLE        var_name4       PRIV    Alter variable4
COMMAND         command3                Perform command3

当我进一步操纵DEFINE_MENU次调用之间的数据时,我举起了旗帜。我编辑了代码以包含我编写的完整方法。

结果当前是一个字典,其中键是菜单标题,值是包含菜单项(标题后面的值)的另一个字典,如下所示:

{'title1': {'1': 'menu_name1', '3': 'var_name1', '2': 'menu_name2', '5': 'command1', '4': 'var_name2'}}

我想要的是一个更大的字典,其中包含菜单标题作为键,最低级字典作为值。我知道这很复杂所以如果不清楚我很抱歉,如果需要更多信息,请告诉我。

再次感谢

汤姆

3 个答案:

答案 0 :(得分:2)

如果我正确理解你的问题描述,你想重复循环 body (在某些情况下)而不是“迭代”。如果是这种情况,一种可行的方法是使循环体成为可能递归的函数,如果循环要中断则返回True,如果要继续则返回False,以及可能的标题。例如,最直接(尽管可能不是最优雅)功能:

def body(line):
    global title_flag

    # skip over comments
    if line[0] == '#':
        return None, False
    # skip over blank lines
    if re.search(r'^\s+$', line):
        return None, False

    # Find the line where the title is defined
    if 'DEFINE_MENU' in line and title_flag == 0:
        type, name = line.split()
        title = name
        title_flag = 1
        return title, body(line)

    # If DEFINE_MENU is found and flag has been raised, this
    # signifies a new menu definition.
    if 'DEFINE_MENU' in line and title_flag == 1:
        return None, True

,主线代码变为:

title_flag = 0

with open('some_file', 'r') as afile:
    for line in afile:
        thetitle, mustbreak = body(line)
        if thetitle is not Note: title = thetitle
        if mustbreak: break

顺便说一句:通过篡改像file这样的内置名称来命名自己的变量 - 这是一个单独的主题;-)。 BTW2:我正在使用with(假设Python 2.6或更高版本,或2.5使用“从未来导入”)只是因为它是 正确的方式来打开和关闭文件; - )。 BTW3:我删除了re.search,因为当一个简单的in运算符显然做同样的工作时,它是肆无忌惮的,无法解释的过度杀伤。

我发布这段代码主要是为了检查一下我是否理解你的规范,因为,行为方面,这绝对是矫枉过正 - 没有必要(从你发布的代码中)重复检查评论和空行,也不搜索'DEFINE_MENU"等等......你可以在设置标题后立即退出(然后body可能再次成为内联代码。)

但是,我想你有理由发布你的问题,即,这个简单的行为(以及可能更简单的行为)对你来说不是最佳的 - 也许是通过查看你的文字的解决方案问题你可以指出你想要的不同于此,然后我们可以实际上帮助你; - )。

答案 1 :(得分:0)

这有点捕捉你的逻辑吗?

menus = []
current_menu = None
for line in file:
    # ...
    # Find the line where the title is defined
    if re.search('DEFINE_MENU', line):
        if not current_menu is None:
            menus.append(current_menu)
        current_menu = Menu()
        type, name = line.split()
        current_menu.setTitle(name)
        continue

Menu将是一个帮助程序类,用于存储属于一个菜单的所有信息。此外,由于您的所有案例似乎都是互斥的,因此请考虑使用elif代替continue

答案 2 :(得分:0)

我不确定你到底想要什么,但是可以将你的标题存储在列表中吗?

titles = []

for line in infile: # don't shadow "file" keyword...

    if "DEFINE_MENU" in line:
        titles.append(line.split()[-1]) # append the last item

如果您只想要前两个标题,则可以添加额外的测试:

if len(titles) == 2: break