值错误,无法对输入fi中的每行数组进行排序

2024-04-26 00:34:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个函数来检查整数数组是否按递增顺序排序,如果是,则返回True。我必须至少用输入文件中的4个数组来测试它。输入文件包括: 11、22、33、10、1999、89(第1行) 22、77、88(第2行) 22、33、44、66(第3行) 33、44、55、66(第4行)。 下面是我的代码:

import sys

file_name = sys.argv[1]
file = open(file_name, 'r')

for line in file.readlines():
    curr_arr = []
    for i in line.split(','):
        curr_arr += [int(i)]

def is_sorted(curr_arr):
    if(len(curr_arr) < 1):
        return True
    if (len(curr_arr) > 2):
        curr_min = curr_arr[0]
        for curr_element in curr_arr:
            if curr_element >= curr_min:
                curr_min == curr_element
            else:
                return False

        return True

print '\nArrays of integers in {} are sorted in an increasing fashion: {}'.format(curr_arr, is_sorted(curr_arr))

当我尝试运行代码时,得到ValueError:invalid literal for int(),base 10:“”位于第9行,当我尝试使用包含4个数组的文件对其进行测试时,代码只返回1个数组。你知道吗

这是我的输出:

[9,10,11,12]中的整数数组按递增方式排序:True


Tags: 文件代码intrueforreturnif整数
3条回答

确保在split()输入之前.strip()输入行。以下是一些读取数据并检查是否使用列表理解进行排序的方法:

#!/usr/bin/env python3

import io

file_ = io.StringIO("""11, 22, 33, 10, 1999, 89
22, 77, 88
22, 33, 44, 66
33, 44, 55, 66""")


def is_sorted(array):
    return all(a <= b
               for a, b in zip(array, array[1:]))


arrays = (tuple(int(n)
                for n in line.strip().split(','))
          for line in file_)
for curr_arr in arrays:
    print('\nArrays of integers in {} are sorted in an increasing fashion: {}'
          .format(curr_arr, is_sorted(curr_arr))
    )

正如我所说,我无法重现ValueError问题。这是我用于测试的输入文件:

11, 22, 33, 10, 1999, 89
22, 33, 44, 99, 66, 77, 88, 50
22, 77, 88
22, 33, 44, 66
33, 44, 55, 66

之所以只处理最后一行,是因为代码开头的for循环一直在为处理的每一行重新初始化curr_arr列表,因此只有最后一行处理的值最终才在其中。你知道吗

下面是代码的一个修改版本,它仍然可以这样做,但是只有在将当前行中的值附加到一个名为arrays的新列表变量之后,我才添加了这个变量,我认为这是您想要的(或者非常接近它):

import sys

def is_sorted(curr_arr):
    if len(curr_arr) < 1:
        return True
    elif len(curr_arr) >= 2:
        curr_min = curr_arr[0]
        for curr_element in curr_arr[1:]:
            if curr_element < curr_min:
                return False
            else:
                curr_min = curr_element

    return True

#file_name = sys.argv[1]
file_name = 'arrays.txt'

arrays = []
with open(file_name, 'r') as file:
    for line in file:
        curr_arr = []
        for i in line.split(','):
            curr_arr.append(int(i))
        arrays.append(curr_arr)

for curr_arr in arrays:
    print 'Array of integers in {} are sorted in an increasing fashion: {}'.format(
        curr_arr, is_sorted(curr_arr))

输出:

Array of integers in [11, 22, 33, 10, 1999, 89] are sorted in an increasing fashion: False
Array of integers in [22, 33, 44, 99, 66, 77, 88, 50] are sorted in an increasing fashion: False
Array of integers in [22, 77, 88] are sorted in an increasing fashion: True
Array of integers in [22, 33, 44, 66] are sorted in an increasing fashion: True
Array of integers in [33, 44, 55, 66] are sorted in an increasing fashion: True

发生错误的原因是i取空字符串''的值(如果仔细查看,请参阅错误消息的最后一段)。因此,line.split(',')返回了一个包含''的列表,如果line本身是空字符串(但这不应该是readlines()的可能结果),或者如果其中一行以,开头或结尾,就会发生这种情况。您应该尝试打印出line.split(',')的结果,如

for line in file.readlines():
    curr_arr = []
    numbers = line.split(',')
    print(numbers)  # Look for unexpected output
    for i in numbers:
        curr_arr += [int(i)]

另一方面,如果数组的长度为2,则is_sorted函数不会返回任何内容(也就是说,它默认返回None),因为您的条件不能捕获这种情况。要解决此问题,请将if (len(curr_arr) > 2):替换为if (len(curr_arr) >= 2):。你知道吗

相关问题 更多 >