从数字字符串中查找最大和最小的数字

5
我正在尝试编写一个函数,该函数返回列表中的最高数字和最低数字。
def high_and_low(numbers):

    return max(numbers), min(numbers)

print(high_and_low("1 2 8 4 5"))

但是我得到了这个结果:

('8', ' ')

为什么我把' '作为最小值?

7
一个空格比其它所有字符都要小。也许可以尝试使用一个整数列表(list of ints)代替? - deceze
2
你正在将数字作为字符串传递,这是文本,而不是数字。 - Thomas Weller
2
你的参数是一个字符串,而不是数字列表。 - Savir
5个回答

8
你正在向函数传递字符串。为了达到预期的结果,你需要将字符串分割并将每个元素强制转换为int类型。只有这样,你的minmax函数才能按照预期工作。例如:
def high_and_low(numbers):
    #    split numbers based on space     v
    numbers = [int(x) for x in numbers.split()]
    #           ^ type-cast each element to `int`
    return max(numbers), min(numbers)

示例运行:

>>> high_and_low("1 2 8 4 5")
(8, 1)

目前您的代码是基于字符字典序查找最小值和最大值。


你好,感谢您提供的解决方案,它给了我缺失的小细节。请问为什么循环要放在方括号中?这是为了确保结果以列表形式呈现吗? - Elarbe

3
为了实现您想要的结果,您可以在传入的字符串上调用split()。这将创建您输入字符串的list(),您可以在其上调用min()max()函数。
def high_and_low(numbers: str):
    """
    Given a string of characters, ignore and split on
    the space ' ' character and return the min(), max()

    :param numbers: input str of characters
    :return: the minimum and maximum *character* values as a tuple
    """
    return max(numbers.split(' ')), min(numbers.split(' '))

正如其他人指出的那样,您还可以传入一个值列表进行比较,并直接调用该列表上的minmax函数。

def high_and_low_of_list(numbers: list):
    """
    Given a list of values, return the max() and 
    min()

    :param numbers: a list of values to be compared
    :return: the min() and max() *integer* values within the list as a tuple
    """
    return min(numbers), max(numbers)

您的原始函数在技术上确实可行,但它比较的是每个字符的数值而不仅仅是整数值。


1
它将从数字字符串中找到minmax,这将是字典序的最小值/最大值。例如:"11"将被视为小于"2"。就性能而言,在这里您需要将字符串分割两次。 - Moinuddin Quadri

1
另一种(更快)使用映射的方法:

def high_and_low(numbers: str):
    #split function below will use space (' ') as separator
    numbers = list(map(int,numbers.split()))
    return max(numbers),min(numbers)

0
使用 numbers_list=[int(x) for x in numbers.split()],并在 min()max() 中使用 numbers_listsplit()'1 23 4 5' 转换为 ['1','23','4','5'];通过使用列表推导式,所有字符串都被转换为整数。

1
我们不能使用 split() 或其他任何方法... 对于像 10 这样的数字会出现错误。 - Arash Hatami
1
我忘记了列表中的值仍然是字符串,我已经编辑了我的答案。 - Zae Zoxol

0

你可以通过' '分割字符串并将其作为数组传递

def high_and_low(numbers):
    # split string by space character
    numbers = numbers.split(" ")
    # convert string array to int, also making list from them
    numbers = list(map(int, numbers))
    return max(numbers), min(numbers)

print(high_and_low("1 2 10 4 5"))

2
这仍然会将其作为文本传递,因此 "1 10 2" 将输出2作为最高数字。 - Thomas Weller
1
你是对的...我们可以通过映射@ThomasWeller来解决这个问题。 - Arash Hatami
1
这段代码在 Python 3 上出现错误 "ValueError: min() arg is an empty sequence"。 - Mark Dickinson
2
还有另一种解决这个问题的方法......谢谢@MarkDickinson - Arash Hatami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接