gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:16:12 25 4
gpt4 key购买 nike

我定义了一个 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'}}

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

再次感谢

汤姆

最佳答案

如果我正确理解你的问题描述,你想重复循环主体(在某些情况下)而不是“迭代”。如果是这种情况,一种可行的方法是将循环体变成一个可能递归的函数,如果循环要中断,则返回 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 带有“从 future 导入”)只是因为它是打开和关闭的正确方法。文件;-)。 BTW3:我删除了 re.search ,因为当一个简单的 in 运算符明显执行相同的工作时,它是肆意的、莫名其妙的过度杀戮。

我发布这段代码主要是为了具体检查我是否理解你的规范,因为从行为角度来看,这绝对是矫枉过正——没有必要(从你发布的代码来看)重复检查注释和空行,也不是搜索 'DEFINE_MENU" 等...您可以在设置标题后立即退出(并且 body 然后可以变为内联再次编码)。

但是,我想您发布问题是有原因的,即,这种简单的行为(并且可以更简单地实现)对您来说并不是最佳的 - 也许通过查看您的文字的解决方案您可以指出您想要的与此不同的问题,然后我们实际上可以帮助您;-)。

关于python - 是否可以重复循环的迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3238080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com