【问题标题】:how can I increment the first number in a range?如何增加范围内的第一个数字?
【发布时间】:2020-10-06 15:50:58
【问题描述】:

学习python,我需要弄清楚增加范围内的第一个数字?


measures = 4
beats_per_measures = 4
beats = 0

for i in range(0, measures):
    for beats in range(1 , beats_per_measure + 1):
        print(beats)

所以我可以得到输出来打印每小节的节拍和小节的数量。繁荣。但现在我需要将第一拍每小节增加一个,我知道这比我做的要容易。我在网上进行了多次搜索,我猜是因为我不知道如何阅读复杂的答案,或者我不知道如何表达我正在尝试做的事情,这就是为什么我还没有找到答案。

【问题讨论】:

  • 所以你想让节拍从 1 而不是 0 开始?
  • 是的。所以它会打印出(在单独的行上) 1 2 3 4 然后 2 2 3 4, 3 2 3 4, 4 2 3 4 并且第一个数字将增加措施的数量,而另一个数字保持不变。跨度>

标签: python-3.x loops for-loop range increment


【解决方案1】:

这是你需要的吗?

我认为您需要将每组 (1,2,3,4) 放在同一行中。

measures = 4
beats_per_measure = 4

for i in range(measures):
    for var_beat in range(beats_per_measure):
        var_beat = str(1 + var_beat)
        fixed_beat = ' '.join([ str(1+f) for f in range(beats_per_measure)[1:]])
        print(var_beat + ' ' + fixed_beat)

我对你评论中的“等等”有点困惑。

【讨论】:

    【解决方案2】:

    你可以这样做:

    for e in range(1,5):
        print(', '.join(map(str, ([e]+list(range(2,5))))))
    

    打印:

    1, 2, 3, 4
    2, 2, 3, 4
    3, 2, 3, 4
    4, 2, 3, 4
    

    或者,也许:

    >>> print('\n'.join([f"{e}, 2, 3 ,4" for e in range(1,5)]))
    # same output
    

    这可以使它变得动态:

    measures = 4
    beats_per_measures = 4
    
    rest_of_measure=', '.join(f'{e}' for e in range(2,beats_per_measures+1))
    print('\n'.join([f"{e}, {rest_of_measure}" for e in range(1, measures+1)]))
    

    【讨论】:

    • 对明确的list 化一个range 的小改进(这总是让我感到不安)只是为了将它与另一个list 连接起来并扔掉临时的。使用广义解包直接构造你想要的list,将print(', '.join(map(str, ([e]+list(range(2,5))))))替换为print(', '.join(map(str, [e, *range(2,5)])))。或者只是让printsep 像我的回答一样完成工作(因为它避免了转换为str 的需要)。
    【解决方案3】:

    根据您的评论,您只想打印一个不断增加的数字,然后是 234。因此,只需根据您当前正在处理的measure 手动打印第一个beat

    for measure in range(1, measures+1):  # Adjust bounds so we don't have to add one inside the loop
        print(measure)    # Prints the changing value
        for beats in range(2, beats_per_measure + 1):
            print(beats)  # Prints the consistent 2, 3, 4 values
    

    如果您希望每个度量位于同一行,最小的更改是只需将 end=''end=' ' 添加到每个 print 并在外部循环的末尾添加一个空的 print()

    更简洁的解决方案是一次只进行print 的每个测量;您可以unpack a range argument with * 使其作为print 的单独参数运行,并使用sep 在两者之间提供您想要的字符,得到类似:

    for measure in range(1, measures + 1):
        print(measure, *range(2, beats_per_measure + 1), sep=', ')
    # prints:
    1, 2, 3, 4
    2, 2, 3, 4
    3, 2, 3, 4
    ...
    

    将分隔符更改为仅一个空格 sep=' ' 或根本不分隔符 sep='' 是微不足道的。

    【讨论】:

    • 对不起。每行一个数字,唯一增加的数字是第一个。所以 1234, 2234, 3234, 4234, 5234。第一个数字将几乎或最终完成的计数等于措施?我希望这更有意义。
    • @MichaelJAdams:甚至没有空格分隔?所以只有for i in range(1234, measures * 1000 + 235, 1000): print(i) 会为你做这件事(虽然measures >= 10 会有点混乱)?
    • @MichaelJAdams:添加了一个解决方案,可以做到这一点(嗯,它包括数字之间的逗号和空格,但最后一行解释了如何摆脱它们,如果这是你想要的)。跨度>
    【解决方案4】:
    measures = 4
    beats_per_measure = 4
    
    
    for measure in range(0 , measures):
        for beats in range(1 , beats_per_measure + 1):
            #print(beats)
            if beats == 1:
                beats += measure
            elif beats != 1:
                beats = beats
            print(beats)
    

    这是我一直在寻找的答案。这是一个 ^%^%$ 条件帮助我做到了!!!感谢您的所有帮助,迫不及待地想插入您的所有建议,看看我还能做些什么!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多