【问题标题】:Create a two dimensional list of ids and corresponding values from user input根据用户输入创建 id 和对应值的二维列表
【发布时间】:2013-02-24 17:55:04
【问题描述】:

我需要一个二维列表来存储有关学生及其成绩的信息。

当我运行我的程序时,我只会得到一份数字列表,但我需要为每个学生单独列出一个列表。谁能帮帮我?

这是我到目前为止所做的:

COLS= int(input("number of students to enter "))
ROWS= int(input("number of grades per student "))

def main():
    number =[]


    for c in range(COLS):
        student =(input("enter student ID number "))
        number.append(student)

        for r in range (ROWS):
            grades =(input("Enter grade for module: "))
            number.append(grades)

    print(number)

my result is 
number of students to enter 2
number of grades per student 4
enter student ID number 1234
Enter grade for module: 55
Enter grade for module: 66
Enter grade for module: 43
Enter grade for module: 33
enter student ID number 2345
Enter grade for module: 34
Enter grade for module: 56
Enter grade for module: 78
Enter grade for module: 99
['1234', '55', '66', '43', '33', '2345', '34', '56', '78', '99']
>>> 

【问题讨论】:

  • 请注意,您正在这里构建列表,一个简单有效的方法是使用list comprehensions

标签: python python-3.x list user-input


【解决方案1】:

您需要为每一行创建一个列表:

for c in range(COLS):
    grades = []
    student =(input("enter student ID number "))
    number.append(student)
    number.append(grades)

    for r in range (ROWS):
        grade =(input("Enter grade for module: "))
        grades.append(grade)

【讨论】:

  • 这实际上似乎不起作用...当 grades 附加到 number 时,它仍然是空的,并且 grades 本身并不是对实际包含在列表,因此更改它不会更新 number 中包含的列表。
  • Python 中的所有内容都是参考,当您在列表之外更新grades 时,它也会影响列表中的内容(因为它们是相同的东西)。
  • 啊。抱歉,我的错误——我在测试时遗漏了最后一行。 (这很愚蠢,因为理论上我知道 Python 是按引用传递的;我只是不总是相信它是按引用传递的,不知何故。 )
【解决方案2】:

我会使用按学生 ID 索引的字典:

COLS= int(input("number of students to enter "))
ROWS= int(input("number of grades per student "))

def main():
    student_grades = {}

    for c in range(COLS):
        student =(input("enter student ID number "))
        grades = []

        for r in range (ROWS):
            grade =(input("Enter grade for module: "))
            grades.append(grade)
        student_grades[student] = grades

【讨论】:

  • +1,这在这里很有意义 - 请注意,在不太可能的情况下,它们的输入顺序很重要,这不会记录下来(dicts 是无序的)。跨度>
  • 真的!在这种情况下,您可以使用collections.OrderedDict
【解决方案3】:

根据我的评论,使用list & dict comprehensions 执行此操作的示例:

cols = int(input("Number of students: "))
rows = int(input("Number of grades per student: "))

grades = {input("Enter student ID number: "): 
             [input("Enter grade for module: ") for _ in range(rows)] 
          for _ in range(cols)}

请注意,这是Kyle Strand's answer 中的字典,而不是列表。这更适合数据,并且会使以后更容易使用它。

另外,一个更好的界面可以通过重复这个来实现,直到用户决定不输入更多学生,而不是预先询问将输入多少学生:

rows = int(input("Number of grades per student: "))

def get_students():
    while True:
        value = input("Enter student ID number, or nothing to finish: ")
        if not vale:
            return
        else:
            yield value

grades = {student: [input("Enter grade for module: ") for _ in range(rows)] 
          for student in get_students()}

这里是通过一个生成器来实现的,它会生成从用户那里获得的新学生编号,直到用户不输入任何内容。

【讨论】:

    【解决方案4】:

    在将其插入number 列表之前构建一个列表:

    for c in range(COLS):
        student =(input("enter student ID number "))
        temp_arr = [student] # make a temporary array for the student id and their grades
    
        for r in range (ROWS):
            grades =(input("Enter grade for module: "))
            temp.append(grades) # append to the temp array here
    
        # after you are done getting the grades
        # insert the entire temp array into the number array
        number.append(temp)
    

    此外,如果您创建了一个 Student 类,该类可能有一个 id 和一个 grades 列表,那么这些数据可能会以更好的方式存储。

    【讨论】:

      【解决方案5】:

      我认为使用列表字典而不是二维列表(列表列表)会更好,因为它使对输入数据的访问和以后的访问更容易和可读。出于同样的原因,我还将其名称从您代码中的 number 更改为下面代码中的 grades,以更好地反映其中的内容。

      COLS = int(input("number of students: "))
      ROWS = int(input("number of grades per student: "))
      
      grades = {}
      
      def main():
          for c in range(COLS):
              student = int(input("enter student ID: "))
              grades[student] = []  # initialize to empty row of grades
      
              for r in range(ROWS):
                  grade = int(input("Enter grade for module: "))
                  grades[student].append(grade)
      
          for student in grades.keys():
              print 'student:{}, grades:{}'.format(student, grades[student])
      

      输入样本数据后的输出:

      student:2345, grades:[34, 56, 78, 99]
      student:1234, grades:[55, 66, 43, 33]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-20
        • 2015-08-13
        • 2017-08-27
        • 2018-03-12
        • 2014-01-22
        • 1970-01-01
        相关资源
        最近更新 更多