【问题标题】:Printing out duplicate items from nested list从嵌套列表中打印出重复项
【发布时间】:2020-12-13 00:56:32
【问题描述】:

系统要求用户输入糖果的名称。如果列表中不存在该甜点,则应通知用户。如果该甜点在列表中,则每次在列表中提到该特定甜点时,该列表都会打印出列表的所有详细信息。例如,如果我输入吉百利:

# List of transactions [[customer, sweet, amount, money, day, month]
lst_sweets = [
    ["Tom", "Cadbury", 2, 9, 1, 10],
    ["Rachel", "Galaxy", 5, 10, 1, 9],
    ["Rachel", "Smarties", 4, 10, 1, 8],
    ["Lisa", "Gum drops", 10, 9, 1, 7],
    ["Donald", "Cadbury", 1, 5, 1, 6],
    ["Marie", "Smarties", 5, 10, 1, 5]
]
def sweet_purchases():
    x = input("Enter the sweet name")

    p = -1
    sum = 0

    for i in range(len(lst_sweets)):

        item = lst_sweets[i]
        name = item[1]

        if name == x:
            p = i

    if p == -1:
        print("customer not in list")
    else:

        sweetx = lst_sweets[p]
        print("Name:", sweetx[0], "Sweet:", sweetx[1], "amount:", sweetx[2], "money:", sweetx[3], "day:", sweetx[4], "month:", sweetx[5])

期望的输出: 姓名:,汤姆,斯威特:,吉百利,金额:,2,钱:,9,日:,1,月:,10 姓名:Donald Sweet:吉百利金额:1、钱:5、日:、1、月:、6

实际输出: 姓名:, Tom, Sweet:, 吉百利, 金额:, 2, 钱:, 9, 日:, 1, 月:, 10

有谁知道为什么两者都没有打印出来?谢谢

【问题讨论】:

    标签: python list function nested-lists python-3.9


    【解决方案1】:

    如果您找到多个匹配项,则会覆盖 p,从而只打印一个匹配项。您应该在循环中打印:

    lst_sweets = [
        ["Tom", "Cadbury", 2, 9, 1, 10],
        ["Rachel", "Galaxy", 5, 10, 1, 9],
        ["Rachel", "Smarties", 4, 10, 1, 8],
        ["Lisa", "Gum drops", 10, 9, 1, 7],
        ["Donald", "Cadbury", 1, 5, 1, 6],
        ["Marie", "Smarties", 5, 10, 1, 5]
    ]
    
    fields = ["name", "sweet", "amount", "money", "day", "month"]
    
    x = input("Enter the sweet name: ")
    found = False
    for sweet in lst_sweets:
        if sweet[1] == x:
            found = True
            print(", ".join(f"{field}: {val}" for field, val in zip(fields, sweet)))
    if not found:
        print("sweet not found")
    

    【讨论】:

      【解决方案2】:
      # List of transactions [[customer, sweet, amount, money, day, month]
      lst_sweets = [
          ["Tom", "Cadbury", 2, 9, 1, 10],
          ["Rachel", "Galaxy", 5, 10, 1, 9],
          ["Rachel", "Smarties", 4, 10, 1, 8],
          ["Lisa", "Gum drops", 10, 9, 1, 7],
          ["Donald", "Cadbury", 1, 5, 1, 6],
          ["Marie", "Smarties", 5, 10, 1, 5]
      ]
      def sweet_purchases():
          x = input("Enter the sweet name")
      
          p = [] # make a list that stores the matching index
          sum = 0
      
          for i in range(len(lst_sweets)):
      
              item = lst_sweets[i]
              name = item[1]
      
              if name == x:
                  p.append(i)
      
          if p == None: # if the list is empty
              print("customer not in list")
          else:
              # Now iterate over the correct list of index and print the values
              for i in p:
                  sweetx = lst_sweets[i]
                  print("Name:", sweetx[0], "Sweet:", sweetx[1], "amount:", sweetx[2], "money:", sweetx[3], "day:", sweetx[4], "month:", sweetx[5])
      

      【讨论】:

        【解决方案3】:

        您在每个循环上设置p 的方式是清除上一个匹配项。

        def sweet_purchases():
          x = input("Enter the sweet name")
          cnt=0
          for entry in lst_sweets:
            if entry[1] == x:
              print(entry) # or whatever
              cmt+=1
          if not cmt:
            print('No joy')
        

        如果您只想打印一些输出,这是最简单的方法。如果您想在找到所有行后做某事,您需要累积结果。像这样的:

        def sweet_purchases():
          x = input("Enter the sweet name")
          hits=[]
          for entry in lst_sweets:
            if entry[1] == x:
              hits.append(entry)
           return hits
        

        但是“pythonic”在不处理列表的情况下查找列表的方法是使用理解:

        def sweet_purchases():
          x = input("Enter the sweet name")
          return [e for e in lst_sweets
                    if e[1] == x]
        

        【讨论】:

          【解决方案4】:

          您的循环只会产生一个匹配项。一种更准确(也更简单!)的方法是使用列表推导生成原始列表的过滤版本,然后遍历过滤后的列表:

          def sweet_purchases():
              sweet = input("Enter the sweet name")
              filtered_entries = [entry for entry in lst_sweets if entry[1] == sweet]
              if not filtered_entries:
                  print("customer not in list")
                  return
              for entry in filtered_entries:
                  [name, sweet, amount, money, day, month] = entry
                  print(f"Name: {name} Sweet: {sweet} amount: {amount} money: {money} day: {day} month: {month}")
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-08-08
            • 2016-10-19
            • 1970-01-01
            • 1970-01-01
            • 2012-11-26
            • 1970-01-01
            相关资源
            最近更新 更多