【问题标题】:Making a list of numbers from a textfile从文本文件制作数字列表
【发布时间】:2014-09-30 22:16:34
【问题描述】:

我正在尝试制作一个对文本文件中的数字列表进行冒泡排序的程序。该文件每行有一个整数。我尝试像这样打开文件:

data = open(file).readlines()

但如果我这样做,换行符\n 将包含在列表中,并且我的冒泡排序仅按第一个数字对数字进行排序(即 6 在 19 之后)。这是我运行程序时发生的情况的示例。我先打印出未排序的列表,然后再打印排序后的列表。

['13\n', '6\n', '87\n', '19\n', '8\n', '23\n', '8\n', '65']
['13\n', '19\n', '23\n', '6\n', '65', '8\n', '8\n', '87\n']

【问题讨论】:

    标签: python sorting file-io


    【解决方案1】:

    您需要将data 的元素转换为整数,因为文件是作为字符串读入的。在进行转换之前,删除\n 字符可能也是明智之举,您可以使用str.strip 进行此操作。

    使用列表推导:

    with open(file, 'r') as f:
        data = [int(line.strip()) for line in f]
    

    我添加了with 上下文管理器。在打开文件时使用它通常是一个好习惯,因为它可以确保文件在之后。另请注意,readlines 实际上并不需要 - 默认情况下,遍历文件会将每一行作为字符串提供。

    实际上,strip 甚至都不需要,因为int 似乎会自动去除空格。不过我可能会保留它以防万一。

    int(' 13')    # 13
    int('13\t')   # 13
    int('13 \n')  # 13
    

    【讨论】:

      【解决方案2】:

      你想要一个整数列表:

      int_data = [int(dat) for dat in data]
      

      当然,最好一次处理一个整数,而不是读取整个文件然后将其转换为整数:

      with open('datafile') as fin:
          int_data = [int(line) for line in fin]
      

      【讨论】:

        【解决方案3】:

        我建议去掉换行符和 int 转换。您可以使用列表解析在一行简洁的代码中执行此操作,但如果列表解析语法令人困惑,则 for 循环也足够了。

        data = open(file).readlines()
        out = [int(x.strip('\n') for x in data]
        out.sort()
        

        【讨论】:

          【解决方案4】:
          with open(filename) as f:
              data = f.read().splitlines() # give list without endline chars
          numbers = map(int, data) 
          # but be careful, this can throw ValueError on non-number strings
          

          如果您希望并非所有行都可以转换为整数,请编写辅助生成器:

          def safe_ints(iterable):
              for item in iterable:
                      try:
                          yield int(item)
                      except ValueError as err:
                          continue
          

          然后使用:

          numbers = list(safe_ints(data))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-09-17
            • 2012-04-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-22
            • 1970-01-01
            • 2022-11-27
            相关资源
            最近更新 更多