遍历列表以创建库存检查器

时间:2018-11-25 16:04:47

标签: python list function

因此,一般来说(3个月左右),我还是编程新手,尽管通过书本学习是好的,但我还是喜欢尝试运用我的知识并通过经验学习。

在我的工作中,我们的仓库工作人员经常会错误地选择订单,因此我正在尝试开发一些东西,以便从.txt文件中提取订单清单并对照所选择的物品进行检查。我觉得这是一项任务,可以用来巩固我目前的一些知识,同时也学习新事物。

from tkinter.filedialog import askopenfilename
#This splits the order .txt file into a list
def picklist(ordernum):
    with open(ordernum, "r") as f:
        mylist = [line.strip() for line in f]

return mylist

def test(list):
    pickeditem = input("Please scan the first item")
    for i in range(len(list)):
        if list[i] == pickeditem:
            print("Correct item.")
        else:
            while list[i] != pickeditem:
                input("Wrong item! Please scan again:")
            if list[i] == pickeditem:
                print("Correct item.")

def order():
    print("Please pick the order you want to complete")
    order = askopenfilename() #gets order .txt from user
    pcklist = picklist(order)
    print("You pick list is: ",pcklist)
    test(pcklist)

order()

因此,一般的想法是创建一个.txt文件,其中包含需要拉出的项目序列号列表,然后在我创建的order函数中以python形式获取。然后,我使用选择列表功能将.txt文件中存储的项目拆分为一个列表,这样我就可以使用户一次扫描一个项目以验证它是否正确。

这是我尝试调用当前称为测试功能的地方。我希望此功能接受列表中的每个项目,如果它等于要打印的扫描项目,那是正确的项目。这很好,对于第一个项目也很好。

问题是要使其迭代到列表中的下一项。因此,如果项目1是2155并且项目2155被扫描,它将说出正确的项目。问题是它会说“错误的项目!请再次扫描:”,因为我认为pythong现在已经移到列表中的项目2上。但是,如果我随后输入2的代码,则会说错项目!请再次扫描。

我尝试过使用列表索引来解决问题-也许我应该在单个函数中执行此操作,而不是按原样拆分它。

我当然不是在寻找任何人为我完成代码,而是确实为我指出了我需要学习的正确方向。该项目的最终目标是保存有关每个项目的仓库位置,所需的每个项目的数量以及从我们的内部订单系统中提取清单的功能。但是,这些是我在学习时希望逐步整合的东西。

我知道这可能不是有史以来最精巧,最pythonic的代码,但实际上是在以后易于阅读,理解和编辑之后的即时消息。

现在,我只需要了解我需要学习的内容/如何思考此问题,以便可以检查提供的.txt文件中的每个项目是否与用户扫描的每个项目相匹配。

谢谢。

1 个答案:

答案 0 :(得分:0)

对于列表中的每个项目,您要扫描选择的项目并进行比较;如果比较失败,您想连续扫描所选项目,直到它们匹配为止。

您真的很亲密-在else套件中,与新扫描项目的比较需要在循环中 ,缩进是错误的;您还需要将input的返回值分配给pickeditem

            while list[i] != pickeditem:
                pickeditem = input("Wrong item! Please scan again:")
                if list[i] == pickeditem:
                    print("Correct item.")

然后在for循环的底部,您需要扫描选择的下一项以将其与列表中的下一项进行比较。

def test(list):
    pickeditem = input("Please scan the first item")
    for i in range(len(list)):
        if list[i] == pickeditem:
            print("Correct item.")
        else:
            while list[i] != pickeditem:
                pickeditem = input("Wrong item! Please scan again:")
                if list[i] == pickeditem:
                    print("Correct item.")
        pickeditem = input("Please scan the next item")

else套件可以简化一些-while语句为您进行比较,因此您无需使用if语句再次进行检查:

def test(list):
    pickeditem = input("Please scan the first item")
    for i in range(len(list)):
        if list[i] == pickeditem:
            print("Correct item.")
        else:
            while list[i] != pickeditem:
                pickeditem = input("Wrong item! Please scan again:")
            print("Correct item.")
        pickeditem = input("Please scan the next item")

您应该始终尝试简化逻辑,以最大程度地减少出现问题/错误的可能性,并使代码更易于阅读。确实不需要if/else语句,因为正在与while语句进行比较。

def test(list):
    pickeditem = input("Please scan the first item")
    for i in range(len(list)):
        while list[i] != pickeditem:
            pickeditem = input("Wrong item! Please scan again:")
        print("Correct item.")
        pickeditem = input("Please scan the next item")

iterating with a for loop不需要使用索引时,可以直接遍历序列项。您不应将python关键字,函数或类名称用作变量名,我将列表名称更改为a_list

def test(a_list):
    pickeditem = input("Please scan the first item")
    for item in a_list:
        while item != pickeditem:
            pickeditem = input("Wrong item! Please scan again:")
        print("Correct item.")
        pickeditem = input("Please scan the next item")

如果需要在迭代时跟踪项目索引,请使用enumerate


您可能对Asking a user for input till they give a valid response的SO答案感兴趣。