Phyton3:删除项目后更新列表,然后

时间:2020-04-23 11:36:20

标签: python python-3.x

我正在做以下练习:

程序:足部骨骼测验

创建一个函数,该函数将迭代foot_bones以寻找 匹配字符串参数

使用脚骨名两次调用该函数,并为每个答案提供反馈(正确-错误)

打印已识别的foot_bones的总数#该程序将使用foot_bones列表:

foot_bones = ["calcaneus", "talus", "cuboid", "navicular", "lateral cuneiform", "intermediate cuneiform", "medial cuneiform"] 

奖金:如果正确,则从列表中删除正确的响应项目,这样用户就不能回答相同的项目两次

这是我为“跟骨”编写的代码:

foot_bones = ["calcaneus", "talus", "cuboid", "navicular", "lateral cuneiform", "intermediate cuneiform", "medial cuneiform"]
def quiz_bones(bone_insert,foot_bones = ["calcaneus", "talus", "cuboid", "navicular", "lateral cuneiform", "intermediate cuneiform", "medial cuneiform"]):
    for bone in foot_bones:
        if bone==bone_insert:
            print("There is",foot_bones.count(bone_insert),bone_insert,"in",foot_bones)
            foot_bones=foot_bones.remove(bone_insert)
            return True
        else:
            print("There is ",foot_bones.count(bone_insert),bone_insert,"in",foot_bones)
            return False

print("It is: ",quiz_bones(bone_insert=input("Type a bone: ")),"that calcaneus","is in",foot_bones)
print("It is: ",quiz_bones(bone_insert=input("Type a bone: ")),"that calcaneus","is in",foot_bones)

哪些给了我以下内容:

Type a bone: calcaneus
There is 1 calcaneus in ['calcaneus', 'talus', 'cuboid', 'navicular', 'lateral cuneiform', 'intermediate cuneiform', 'medial cuneiform']
It is:  True that calcaneus is in ['calcaneus', 'talus', 'cuboid', 'navicular', 'lateral cuneiform', 'intermediate cuneiform', 'medial cuneiform']
Type a bone: calcaneus
There is  0 calcaneus in ['talus', 'cuboid', 'navicular', 'lateral cuneiform', 'intermediate cuneiform', 'medial cuneiform']
It is:  False that calcaneus is in ['calcaneus', 'talus', 'cuboid', 'navicular', 'lateral cuneiform', 'intermediate cuneiform', 'medial cuneiform'] #The list hasn't been updated because it is not part of the function.

如何修改代码,以便在删除“跟骨”后最后一条语句显示更新的列表?

此外,在这种类型的陈述中:“是的,跟骨位于['跟骨','距骨','立方体','水母','侧楔形,'中间楔形, '内侧楔形文字']” 无论输入内容如何,​​我都想修改“跟骨”。但是,当我为以下内容修改代码的最后两行时:

print("It is: ",quiz_bones(bone_insert=input("Type a bone: ")),"that",bone_insert,"is in",foot_bones)
print("It is: ",quiz_bones(bone_insert=input("Type a bone: ")),"that",bone_insert,"is in",foot_bones)

我得到以下信息:

Type a bone: calcaneus
There is 1 calcaneus in ['calcaneus', 'talus', 'cuboid', 'navicular', 'lateral cuneiform', 'intermediate cuneiform', 'medial cuneiform']
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-7-8992c9c37974> in <module>()
     14             return False
     15 
---> 16 print("It is: ",quiz_bones(bone_insert=input("Type a bone: ")),"that",bone_insert,"is in",foot_bones)
     17 print("It is: ",quiz_bones(bone_insert=input("Type a bone: ")),"that",bone_insert,"is in",foot_bones)

NameError: name 'bone_insert' is not defined

如何解决此问题?谢谢!!!!!!

3 个答案:

答案 0 :(得分:3)

print("It is: ",quiz_bones(bone_insert=input("Type a bone: ")),"that",bone_insert,"is in",foot_bones)

在此代码中,首先bone_insert是传递给函数的参数名称,而不是变量。

要使其工作,只需多行即可完成

bone_insert = input("Type a bone: ")
print("It is: ",quiz_bones(bone_insert=bone_insert),"that",bone_insert,"is in",foot_bones)

如何修改代码,以便在删除“跟骨”后最后一条语句显示更新的列表?

问题是您在函数内部和外部使用了不同的列表。

foot_bones = ["calcaneus", "talus", "cuboid", "navicular", "lateral cuneiform", "intermediate cuneiform", "medial cuneiform"]
def quiz_bones(bone_insert,foot_bones = ["calcaneus", "talus", "cuboid", "navicular", "lateral cuneiform", "intermediate cuneiform", "medial cuneiform"]):

这两个名称相同,但是一个是全局变量,另一个是局部变量。

只需删除第二个参数:

def quiz_bones(bone_insert):

现在该函数将看到在本地范围内没有foot_bones,因此它将查找!

但是:

foot_bones=foot_bones.remove(bone_insert)

此行是错误的。 list.remove不返回任何内容(您将用None覆盖列表!),并且您不能不说自己就更改全局变量。

只需:

foot_bones.remove(bone_insert)

现在,您仅在列表的内部进行操作(之所以有效,因为列表是可变的)。

答案 1 :(得分:1)

我认为使用过滤器对您有所帮助。搜索后要删除该项目的提示。 有很多选择。 请注意,这只是一个示例,我试图使它看起来更好,然后我可能会删除一些变量。 但这是个人的品尝。

类似的东西

foot_bones = ["calcaneus", "talus", "cuboid", "navicular", "lateral cuneiform", "intermediate cuneiform", "medial cuneiform"]

selected_item = 'calcaneus' #for example

def look_for_match(item):
    return selected_item not in item

list_without_selectd_item = list(filter(look_for_match, foot_bones))
number_of_apperences = len(foot_bones) - len(list_without_selectd_item)
print(f'the {selected_item} apper {number_of_apperences} times')
selected_item = 'talus'
list_after_two_filters = list(filter(look_for_match, list_without_selectd_item))
number_of_apperences_second_filter = len(list_without_selectd_item) - len(list_after_two_filters)
print(f'the {selected_item} apper {number_of_apperences_second_filter} times')

答案 2 :(得分:0)

您需要将输入分配给变量,并在结果后删除。

f_bones = ["calcaneus", "talus", "cuboid", "navicular", "lateral cuneiform", "intermediate cuneiform", "medial cuneiform"]

def quiz_bones(bone_insert, foot_bones):
    for bone in foot_bones:
        if bone == bone_insert:
            print("There is",foot_bones.count(bone_insert),bone_insert,"in",foot_bones)            
            print('foot_bones')
            return True, foot_bones
        else:
            print("There is ",foot_bones.count(bone_insert),bone_insert,"in",foot_bones)
            return False, foot_bones

while True:
    bone_insert = input("Type a bone: ") # assign input to a varialbe
    res, f_bones = quiz_bones(bone_insert, foot_bones=f_bones)    # return  modified list
    print("It is: ",res,"that", bone_insert, "is in",f_bones) # print Result
    if res: # if result is True.
        f_bones.remove(bone_insert) # remove item from list.