【问题标题】:How to create a range of numbers with a given increment如何创建具有给定增量的数字范围
【发布时间】:2013-08-21 22:18:19
【问题描述】:

我想知道列表中是否有等效的语句来执行以下操作。在 MATLAB 中,我会执行以下操作

fid = fopen('inc.txt','w')
init =1;inc = 5; final=51;
a = init:inc:final
l = length(a)
for i = 1:l
   fprintf(fid,'%d\n',a(i));
end
fclose(fid);

简而言之,我有一个初始值、一个最终值和一个增量。我需要创建一个数组(我看它相当于python中的列表)并打印到一个文件中。

【问题讨论】:

  • 您的标题似乎与您的问题不符。
  • @Russel Borogove 原谅我。实际上我昨天写了一个不同的问题,我得到了答案。当我更改问题时,我不知道即使过了一天,标题仍然存在;)
  • @Vaidyanathan 顺便说一句,您实际上并不需要 MATLAB 中的循环。 fprintf(fid,'%d\n', a); 就足够了。

标签: python file list matlab


【解决方案1】:

我认为原始发布者也希望 51 出现在列表中。

这方面的 Python 语法有点笨拙,因为您需要为 range(或 xrange 或 arange)提供一个上限参数,该参数超出您实际所需的上限一个增量。一个简单的解决方案如下:

init = 1
final = 51
inc = 5
with open('inc.txt','w') as myfile:
    for nn in xrange(init, final+inc, inc):
        myfile.write('%d\n'%nn)

【讨论】:

    【解决方案2】:

    在 Python 中,range(start, stop + 1, step) 可以像 Matlab 的 start:step:stop 命令一样使用。然而,与 Matlab 的功能不同的是,range 仅在 startstepstop 都是整数时才有效。如果您想要一个处理浮点值的并行函数,请尝试来自numpyarange 命令:

    import numpy as np
    
    with open('numbers.txt', 'w') as handle:
        for n in np.arange(1, 5, 0.1):
            handle.write('{}\n'.format(n))
    

    请记住,与 Matlab 不同,rangenp.arange 都希望它们的参数按顺序为 startstop,然后是 step。另请注意,与 Matlab 语法不同,rangenp.arange 都会在当前值大于或等于停止值时立即停止。

    http://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html

    【讨论】:

    • 这更通用。谢谢你。 with .. asf.open()\f.close() 有什么区别。还喜欢带有 examples for python 的 matlab 内置教程。在网站上看起来更加混乱。
    • with .. as 构造基本上是f.open() .. f.close() 的简写,除了f.close() 保证在出现异常时被调用 (examples)。
    • Python 并没有真正的内置教程,但是在docs.python.org/2/tutorial 上有一个在线教程,还有很多其他人写的。尝试一对夫妇来感受一下。
    【解决方案3】:

    您可以轻松地为此创建一个函数。函数的前三个参数是整数形式的范围参数,最后一个第四个参数是文件名,作为字符串:

    def range_to_file(init, final, inc, fname):
        with open(fname, 'w') as f:
            f.write('\n'.join(str(i) for i in range(init, final, inc)))
    

    现在您必须使用自定义值调用它:

    range_to_file(1, 51, 5, 'inc.txt')
    

    所以您的输出将是(在fname 文件中):

    1
    6
    11
    16
    21
    26
    31
    36
    41
    46
    

    注意: 在 Python 2.xa 中 range() 在 Python 3.xa 中返回一个列表 range() 返回一个不可变的序列迭代器,如果你想得到一个列表,你必须写 list(range())

    【讨论】:

      【解决方案4】:

      test.py 包含:

      #!/bin/env python                                                                                                                                                                                  
      
      f = open("test.txt","wb")                                                                                                                                                                           
      for i in range(1,50,5):                                                                                                                                                                             
          f.write("%d\n"%i)
      
      f.close()
      

      你可以执行

      python test.py

      文件test.txt 看起来像这样:

      1
      6
      11
      16
      21
      26
      31
      36
      41
      46
      

      【讨论】:

      • 最好将open 函数与with/as 语句一起使用。即使在文件操作过程中发生异常,它也会关闭文件。
      • @PeterVaro 非常感谢。有效。就一个问题。假设我正在读取与 int 形成对比的浮点值,例如,代码将是 for i in range(1.5,51.5,5)。但这会引发错误,说range() integer end argument expected, got float.
      • @Vaidyanathan 你可能需要为range() 构建一个你自己的浮点数。看这里,stackoverflow.com/questions/477486/…
      【解决方案5】:

      我认为您正在寻找这样的东西:

      nums = range(10) #or any list, i.e. [0, 1, 2, 3...]
      number_string = ''.join([str(x) for x in nums])
      

      [str(x) for x in nums] 语法称为列表推导。它允许您即时建立一个列表。 '\n'.join(list) 用于获取字符串列表并将它们连接在一起。 str(x) 是一种类型转换:它将整数转换为字符串。

      或者,使用简单的 for 循环:

      number_string = ''
      for num in nums:
          number_string += str(num)
      

      关键是在连接之前将值转换为字符串。

      【讨论】:

        【解决方案6】:
        open('inc.txt','w').write("\n".join(str(i) for i in range(init,final,inc)))
        

        【讨论】:

        • 最好将open 函数与with/as 语句一起使用。它会为你关闭文件——即使发生了异常——你在代码 sn-p 中错过了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 1970-01-01
        • 1970-01-01
        • 2014-10-11
        • 1970-01-01
        相关资源
        最近更新 更多