【问题标题】:Python ,Nested dictionary elements linkingPython,嵌套字典元素链接
【发布时间】:2018-11-22 20:59:48
【问题描述】:

我正在尝试输入 n 名学生的分数并找到特定学生的平均分。我正在使用嵌套字典项并尝试在一行代码中输入。标记的范围仅从 0 到 100,我需要在链接到字典键之前执行此操作。下面是我的代码,我没有达到范围(0到100)的条件。请帮忙。

if __name__ == '__main__':
n = int(input())
if n in range(2,11):
    student_marks = {}
    for _ in range(n):
        line = input().split()
        name = line[0]
        scores =  line[1:]
        scores = list(map(float, scores))

        truth,x,y = 0,0,0
        y = len(scores)
        for x in scores:
            if 0<=x<=100:
                truth = truth+1

        if(truth == y):
            student_marks[name] = scores
        else:
            print("Marks out of range")

    query_name = input()

    add = 0
    m=0
    for s in student_marks[query_name]:
        m = m+1
    if x in student_marks:
        if x == query_name :
            for y in student_marks[query_name]:
                add = add + y
            average = float(add/m)
        else:
            print("Name doesnt exist.Enter correct name and start again")
    else:
         print("The person not ideally linked,since incorrect marks entered,Enter properly and try again")

    print("%.2f" % average)

【问题讨论】:

  • 没关系n是学生人数。你能解释一下,每个学生有多少科目?
  • 任意数量的科目
  • 好的,学生人数也不固定(任何学生人数)?

标签: python dictionary nested conditional-statements nested-lists


【解决方案1】:

您应该使用if x &gt;= 0 and x &lt;= 100 而不是if x in range(0,101),或者按照@mata 的建议,您可以使用if 0 &lt;= x &lt;= 100

x in range(0, 101) 仅在 x 是整数且介于 0 和 100(含)之间时才返回 True

【讨论】:

  • 更好:0 &lt;= x &lt;= 100
  • 已编辑!这是它的工作原理:docs.python.org/3/reference/…
  • 我没有完全理解逻辑。你能举例说明一下吗? X 始终是整数。
  • x 并不总是整数,您可以在此处将其转换为浮点数 - scores = list(map(float, scores))
  • 好的,谢谢。如果不符合我们的条件,通过 input().split() 输入值后是否有可能引发错误?假设我输入 103 并且链接之前的程序应该通过错误“标记超出范围”并要求我在该位置输入正确的值。有可能吗?
【解决方案2】:

@Mahantesh,当我阅读并从您的代码中理解时,我已尝试以我的方式解决您的问题。我取的变量名称与您取的相同。

我还使用json 模块来漂亮地打印字典。

请检查以下代码,如果您需要任何更改,请告诉我。

别忘了检查输出。

import json 

def get_averages():
    student_marks = {};
    successful_trials = 0; # IT IS NOT REQUIRED, JUST TO MAKE PROGRAM USER FRIENDLY

    while True:
        try:
            # CREATE A LIST 
            # ['Rishikesh', '90', '95', '90', '80', '85', '70']
            line = input('\n('+ str(successful_trials + 1) + ') ENTER NAME SEPARATED BY 1 OR MORE SCORES SPACE SEPARATED (TYPE exit TO STOP) >>> ').split(); 
            if len(line) > 0: 
                # NAME OF STUDENT  => 'Rishikesh'
                name = line[0]; 

                if name.lower() == 'exit': # IF USER ENTERS ANYTHING STARTING WITH exit (stop iteration)
                    break

                # SCORES OF A STUDENT (INTEGERS) => [90, 95, 90, 80, 85, 70]
                scores = [int(number) if (int(number) >= 0 and int(number) <= 100) else -1 for number in line[1:]] 

                if not scores:
                    print("\nERROR: INPUT SHOULD HAVE  AT LEAST 1 OR MORE SCORES (SPACE SEPARATED)")
                    continue    
            else:
                print("\nERROR: INPUT SHOULD HAVE NAME FOLLOWED BY AT LEAST 1 OR MORE SCORES (SPACE SEPARATED)")
                continue

            if -1 not in scores: # SCORES ARE IN RANGE MEANS IT IS NOT LIKE [90, -1, 90, -1, 85, 70]
                student_marks[name] = {
                    "scores": scores,
                    "average": sum(scores) / len(scores) # AVERAGE
                }
            else:
                print("\nERROR: ENTERED SCORES ARE NOT IN RANGE")
                continue    

            successful_trials += 1; # IF EVERYTHING PASSED
        except Exception as error:
            print('\nERROR OCCURED: ', error)
            print("\nPLEASE ENTER CORRECT VALUE")
            continue

    return student_marks; # DICTIONARY OF DICTIONARIES

if __name__ == "__main__":
    # CALL TO get_averages()
    student_marks = get_averages();

    # PRETTY PRINTING DICTIONARY USING json MODULE
    print(json.dumps(student_marks, indent=4));

» 输出1

(py3.6) H:\RishikeshAgrawani\Projects\Sof\EntrySof>python EntrySof.py

(1) ENTER NAME SEPARATED BY 1 OR MORE SCORES SPACE SEPARATED (TYPE exit TO STOP) >>> student1 56 67 35 45

(2) ENTER NAME SEPARATED BY 1 OR MORE SCORES SPACE SEPARATED (TYPE exit TO STOP) >>> student2 67 45  35 24

(3) ENTER NAME SEPARATED BY 1 OR MORE SCORES SPACE SEPARATED (TYPE exit TO STOP) >>> student3 101 56

ERROR: ENTERED SCORES ARE NOT IN RANGE

(3) ENTER NAME SEPARATED BY 1 OR MORE SCORES SPACE SEPARATED (TYPE exit TO STOP) >>> student3 100 0 90

(4) ENTER NAME SEPARATED BY 1 OR MORE SCORES SPACE SEPARATED (TYPE exit TO STOP) >>> student4 ok new

ERROR OCCURED:  invalid literal for int() with base 10: 'ok'

PLEASE ENTER CORRECT VALUE

(4) ENTER NAME SEPARATED BY 1 OR MORE SCORES SPACE SEPARATED (TYPE exit TO STOP) >>> student4 70 40 50 70

(5) ENTER NAME SEPARATED BY 1 OR MORE SCORES SPACE SEPARATED (TYPE exit TO STOP) >>> exit
{
    "student1": {
        "scores": [
            56,
            67,
            35,
            45
        ],
        "average": 50.75
    },
    "student2": {
        "scores": [
            67,
            45,
            35,
            24
        ],
        "average": 42.75
    },
    "student3": {
        "scores": [
            100,
            0,
            90
        ],
        "average": 63.333333333333336
    },
    "student4": {
        "scores": [
            70,
            40,
            50,
            70
        ],
        "average": 57.5
    }
}

» 输出2

(py3.6) H:\RishikeshAgrawani\Projects\Sof\EntrySof>python EntrySof.py

(1) ENTER NAME SEPARATED BY 1 OR MORE SCORES SPACE SEPARATED (TYPE exit TO STOP) >>> hygull 50 60 70

(2) ENTER NAME SEPARATED BY 1 OR MORE SCORES SPACE SEPARATED (TYPE exit TO STOP) >>> gurudev 78 22 50 55 45

(3) ENTER NAME SEPARATED BY 1 OR MORE SCORES SPACE SEPARATED (TYPE exit TO STOP) >>> user1 60 -5 9

ERROR: ENTERED SCORES ARE NOT IN RANGE

(3) ENTER NAME SEPARATED BY 1 OR MORE SCORES SPACE SEPARATED (TYPE exit TO STOP) >>> user2 100 40 kite

ERROR OCCURED:  invalid literal for int() with base 10: 'kite'

PLEASE ENTER CORRECT VALUE

(3) ENTER NAME SEPARATED BY 1 OR MORE SCORES SPACE SEPARATED (TYPE exit TO STOP) >>> user3 90 90 100 50

(4) ENTER NAME SEPARATED BY 1 OR MORE SCORES SPACE SEPARATED (TYPE exit TO STOP) >>> exit
{
    "hygull": {
        "scores": [
            50,
            60,
            70
        ],
        "average": 60.0
    },
    "gurudev": {
        "scores": [
            78,
            22,
            50,
            55,
            45
        ],
        "average": 50.0
    },
    "user3": {
        "scores": [
            90,
            90,
            100,
            50
        ],
        "average": 82.5
    }
}

【讨论】:

  • 非常感谢。即使我成功实现了相同的代码。
【解决方案3】:

以下是我的代码,它运行良好。

if __name__ == '__main__':
    n = int(input())
    if n in range(2,11):
        student_marks = {}
        for _ in range(n):
            line = raw_input().split()
            name = line[0]
            scores =  line[1:]
            scores = list(map(float, scores))

            truth,x,y = 0,0,0
            y = len(scores)
            for x in scores:
                if 0<=x<=100:
                    truth = truth+1

            if(truth == y):
                student_marks[name] = scores
            else:
                print("Marks out of range")

        query_name = raw_input()

        add = 0
        m=0
        """for s in student_marks[query_name]:
            m = m+1"""
        #if x in student_marks:
        for x in student_marks:
            if x == query_name:
                y = len(student_marks[query_name])
                for g in (student_marks[query_name]):
                    add = add + g
                average = float(add/y)
                print("%.2f" % average)

【讨论】:

    猜你喜欢
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    相关资源
    最近更新 更多