【问题标题】:Python: Why does this loop repeat for each item? [duplicate]Python:为什么每个项目都重复这个循环? [复制]
【发布时间】:2019-03-18 11:04:36
【问题描述】:

我正在尝试创建一个程序,将飞蛾的每一天与相应的工作日关联起来。但是,我在附加工作日时遇到了问题。

January  = ["1", "2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"]

days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
for i in (January):
    for j in days:
        print("January", i,j)

运行时,我得到以下结果:

January 1 Monday
January 1 Tuesday
January 1 Wednesday
January 1 Thursday
January 1 Friday
January 1 Saturday
January 1 Sunday
January 2 Monday
January 2 Tuesday
January 2 Wednesday
January 2 Thursday
January 2 Friday
January 2 Saturday
January 2 Sunday

这种情况一直持续到 31 点。

任何帮助将不胜感激,因为我不明白我哪里出错了。

谢谢! :)

【问题讨论】:

    标签: python loops iteration


    【解决方案1】:

    使用嵌套的for 循环,您是在说“对于January 中的每一天,迭代 days 并打印一些东西`。

    迭代这个词是这里的关键。您正在查看daysJanuary 中每个元素的整个列表。

    您实际上要做的是循环days 的元素,同时迭代January 的元素。幸运的是,我们有 itertools.cycle

    这就是我将如何实现您的想法。

    >>> from itertools import cycle
    >>> 
    >>> january = range(1, 32)
    >>> days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
    >>> 
    >>> for day, dayname in zip(january, cycle(days)):
    ...     print('January {} {}'.format(day, dayname))
    ... 
    January 1 Monday
    January 2 Tuesday
    January 3 Wednesday
    January 4 Thursday
    January 5 Friday
    January 6 Saturday
    January 7 Sunday
    January 8 Monday
    January 9 Tuesday
    January 10 Wednesday
    January 11 Thursday
    January 12 Friday
    January 13 Saturday
    January 14 Sunday
    January 15 Monday
    January 16 Tuesday
    January 17 Wednesday
    January 18 Thursday
    January 19 Friday
    January 20 Saturday
    January 21 Sunday
    January 22 Monday
    January 23 Tuesday
    January 24 Wednesday
    January 25 Thursday
    January 26 Friday
    January 27 Saturday
    January 28 Sunday
    January 29 Monday
    January 30 Tuesday
    January 31 Wednesday
    

    如果这不仅仅是一个编程练习,您可能需要查看datetime 模块以避免手动计算给定日期的工作日。

    【讨论】:

      【解决方案2】:

      第二个循环遍历一周中的所有 7 天,然后转到该月的第二天。

      一种方法是使用模运算:

      January  = ["1", "2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"]
      
      days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
      
      for i in (January):
          # Need to subtract 1 because the loop variable i starts from 1 and not 0 
          current_day = (int(i) % 7) - 1
          print("January", i, days[current_day])
      

      输出:

      January 1 Monday
      January 2 Tuesday
      January 3 Wednesday
      January 4 Thursday
      January 5 Friday
      January 6 Saturday
      January 7 Sunday
      January 8 Monday
      January 9 Tuesday
      January 10 Wednesday
      January 11 Thursday
      January 12 Friday
      January 13 Saturday
      January 14 Sunday
      January 15 Monday
      January 16 Tuesday
      January 17 Wednesday
      January 18 Thursday
      January 19 Friday
      January 20 Saturday
      January 21 Sunday
      January 22 Monday
      January 23 Tuesday
      January 24 Wednesday
      January 25 Thursday
      January 26 Friday
      January 27 Saturday
      January 28 Sunday
      January 29 Monday
      January 30 Tuesday
      January 31 Wednesday
      

      【讨论】:

        【解决方案3】:

        您的代码有几个问题:

        • 您需要循环浏览您的日期字符串('Monday'、'Tuesday' 等) 反复。您没有指定任何逻辑来实现这一点。一种解决方案(见下文)是itertools.cycle
        • 您不需要创建字符串数字列表。您不需要列表,甚至不需要字符串。只需使用 range 对象来指定范围。
        • 使用zip 依次迭代可迭代的日期数字和字符串。然后,您只需要一个 for 循环。
        • 您可以使用 f 字符串 (Python 3.6+) 作为手动字符串连接的有效且可读的替代方法。

        这是一个工作示例:

        from itertools import cycle
        
        January_days = range(1, 32)
        
        days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
        
        for day_num, day_str in zip(January_days, cycle(days)):
            print(f'January {day_num} {day_str}')
        
        January 1 Monday
        January 2 Tuesday
        January 3 Wednesday
        January 4 Thursday
        ...
        January 27 Saturday
        January 28 Sunday
        January 29 Monday
        January 31 Wednesday
        

        【讨论】:

          【解决方案4】:
          for i in (January):
          for j in days:
              print("January", i,j)
          

          这是

          for i in ["1", "2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"] :
              for j in ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]:
              print("January", i, j)
          

          在外循环的第一次迭代中

          i = "1"
          j = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
          

          在外循环的第一次迭代中

          i = "2"
          j = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
          

          ....

          因此上面的输出。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-11-12
            • 1970-01-01
            • 2019-01-09
            • 2016-03-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-26
            相关资源
            最近更新 更多