遍历字符串以扩展特定字符Pyhton

时间:2020-10-02 20:42:36

标签: python

Productions = {
    "stat_list": [("<stat>", 0.2), ("stat_list", 0.8)],
    "stat": [("<cmpd_stat>", 0.2), ("<stat>", 0.3), ("<if_stat>", 0.3), ("<iter_stat>", 0.4), (" 
           <assgn_stat>", 0.5), ("<decl_stat>", 0.7)],
    "cmpd_stat": [("{ <stat_list> }", 0.5)],
#more code...
    "type": [("int", 0.2), ("double",0.8)],
    "const": [("<digit><digit_seq>",0.7)],
    "digit_seq": [("{empty]", 0.2), ("<digit><digit_seq>", 0.8)],
    "char": [( "[A-Z]", 0.2), ("[a-z]", 0.4),  ("_", 0.7)],
    "digit": [([0, 2, 3, 4, 5, 6, 7, 8, 9], 0.5)],

def generateRandom(Productions):
    r5 = random.randint(0, 1)
    for i in Productions:
        if Productions[i] >= r5:
            return Productions.get(i)


def getStatementFromExpansion(prog):
    start = generateRandom(Productions)
    while prog in "<" or ">":
        if start == "<stat_list>":
            return prog.replace(start, Productions.items(start), 1)
        if start == '<stat>':
             return prog.replace(start, Productions.items(start), 1)
        #more similar code...

prog = "int main () { <stat> return 0; }"
print(getStatementFromExpansion(prog))

因此,此分配的目的是循环通过该编,并且每次看到<>都会对其进行扩展,例如将扩展为或。 3.它将继续执行直到没有更多<>为止,输出应该如下所示: int main(){int F0Z = 0262; if(22682/525)double S1; else h = U; while(8-594873){4 = 5}返回0; 我的错误当前是TypeError:“ list”和“ int”的实例之间不支持“> =”

1 个答案:

答案 0 :(得分:0)

由于Productions是列表的字典,因此您尝试将列表与int进行比较。您必须访问要比较的Productions [i]的特定值。

例如,现在您具有以下键值对:

"type": [("int", 0.2), ("double",0.8)],

您想使用0.2与r5进行比较,您可以使用:

Productions['type'][0][1]
#list at type - first tuple of the list - second value of the tuple

一旦知道要访问的值,就可以将方括号以菊花链方式连接,因为它返回一个对象,然后可以使用该对象使用方括号来访问某个值。

P.S get()用于字典,可让您“获取”某个键的值,并且还可以在键不存在的情况下获取默认值。另一方面,index()为您提供列表中某个对象的首次出现的索引位置。