我的Python代码出了什么问题?

时间:2017-04-30 11:24:57

标签: python string

我是编程和Python的新手。在这里,我尝试编写一个代码,该代码从用户接收矩阵(写为列表列表),并将此字符串设置为" real"列表:

def string_to_matrix(arg):
    result = []
    lines = arg.count("[") - 1
    for i in range(lines):
        result.append([])
    count = 0
    i = 2
    while i <= len(arg):
        if arg[i] == "[":
            count += 1
            i += 1
        elif arg[i].isdigit():
            new_number = 0
            while arg[i].isdigit():
                new_number = 10*new_number + int(arg[i])
                i += 1
            result[count].append(new_number)
    return result


m_1 = string_to_matrix(raw_input("Type your first matrix in format [[x, y, ...],[z, ...],[...], ...]: "))
print m_1

但是在输入矩阵(例如[[1]]或[[1,2],[3,4]])之后,代码永远循环并且永远不会打印任何东西。我做错了什么?

3 个答案:

答案 0 :(得分:2)

您的问题不明确,所以无法提供太多帮助,但请仔细阅读以下代码,看看它是否打印出正确的输出。

def string_to_matrix(arg):
    result = []
    lines = arg.count("[") - 1
    for i in range(lines):
        result.append([])
    count = 0
    i = 2
    while i < len(arg):
        if arg[i] == "[":
            count += 1
            i=i+1
        elif arg[i].isdigit():
            new_number = 0
            while arg[i].isdigit():
                new_number = 10*new_number + int(arg[i])
                i=i+1
            result[count].append(new_number)
        else:
            i=i+1
    return result 

答案 1 :(得分:2)

问题已被搁置,但我会尽力回答,而你应该改进它。阅读how to ask good questions。提出你的问题“出了什么问题”并不是一个正确的问题。

def string_to_matrix(arg):
    result = []
    lines = arg.count("[") - 1
    for i in range(lines):
        result.append([])
    count = 0
    i = 2
    while i < len(arg):
        if arg[i] == "[":
            count += 1
            i += 1
        elif arg[i].isdigit():
            new_number = 0
            while arg[i].isdigit():
                new_number = 10*new_number + int(arg[i])
                i += 1
            result[count].append(new_number)
        else:
            i += 1
    return result


m_1 = string_to_matrix(input("Type your first matrix in format [[x, y, ...],[z, ...],[...], ...]: "))
print(m_1)

您的代码有几个问题。用作语句而不是函数(没有大括号)的所有raw_inputprint的拳头将不适用于您正在使用的python 3。其次,如果你试图在由i个元素组成的列表中找到索引i的元素,那么你将超出它的范围。请记住,大多数现代编程语言都从0开始迭代列表和数组,这意味着您可能进入的最大元素具有索引i-1。此外,您不会在每次运行中增加i计数器,这会导致程序进入无限循环。

上面的代码包含了我必须进行的最小化更改才能正常运行。但是,可以对其进行改进以满足python标准并更有效地使用它提供的所有内容。

  1. 尽可能使用列表理解。这样可以使代码简单明了。考虑使用这个:

    result = [[] for i in range(lines)]

  2. 而不是:

    result = []
    lines = arg.count("[") - 1
    for i in range(lines):
        result.append([])
    
    1. 考虑在字符串上使用split方法。看看这个:

      arg ='[[1,2,3],[4,5,6],[7,8,9]]'

      打印(ARG [2:-2] .split( '],['))

      ['1,2,3','4,5,6','7,8,9']

    2. 请参阅?在一行中,您将获得一个字符串列表,您可以轻松地将其解析为矩阵的各行。看看现在发生了什么:

      >>> l = '1, 2, 3'.split(',')
      >>> l
      ['1', ' 2', ' 3']
      >>> l1 = [int(value) for value in l]
      >>> l1
      [1, 2, 3]
      

      当然你可以添加一些更有意义的名字,检查用户数据的正确性等等,但我想你可以利用我在这里写的例子。

答案 2 :(得分:1)

如果你愿意,这是另一种简单的方法:

def string_to_matrix(arg):
    result = []
    i=1
    while i<len(arg)-1:
        if(arg[i]=='['):
            i+=1
            temp = ""
            while(arg[i]!=']'):
                temp+=arg[i]
                i+=1
            temp = temp.split(',')
            temp2 = []
            for j in temp:
                temp2.append(int(j.strip(' ')))
            result.append(temp2)
        else:
            i+=1
    return result


m_1 = string_to_matrix(raw_input("Type your first matrix in format [[x, y, ...],[z, ...],[...], ...]: "))
print m_1