【问题标题】:Why my code cannot find maximum number in string of numbers (space separated)为什么我的代码在数字字符串中找不到最大数字(空格分隔)
【发布时间】:2018-05-17 14:36:05
【问题描述】:

我把这个字符串给了我想从中找到最大值的python代码。

>>> a = ("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6")
>>> a = a.split(" ")
>>> max(a)
>>> 6

谁能解释一下为什么它没有返回 542? 终于找到了正确的代码:

>>> a = a.split(" ");
>>> a = [int(i) for i in a];
>>> return str(max(a))

但是谁能告诉我我在以前的代码中的愚蠢之处。

【问题讨论】:

  • 拆分后,a 仍然是一个字符串列表。在调用 max 之前将其映射到整数列表
  • 尝试在分割线后打印出a的值,你会看到
  • 不正确复制粘贴到您的问题中。 REPL 中的>>> max(a) 将输出'6',而不是>>> 6!这应该作为一个提示:)
  • 是的,我没有观察到

标签: python python-3.x python-2.7


【解决方案1】:

您还可以通过传递key 来查找最大字符串,就像将其解释为整数一样

max(a.split(), key=int)

'542'

然后将其设为 int

int(max(a.split(), key=int))

542

【讨论】:

  • 很好。你知道为什么使用key=float 会更快吗? %timeit max(a.split(), key=int) 提供100000 loops, best of 3: 4.68 µs per loop%timeit max(a.split(), key=float) 提供100000 loops, best of 3: 2.43 µs per loop
  • 我不知道。不过很有趣。
  • 似乎也适用于更大的列表。
  • Python 3.6,真的看不出太大的区别。 3.77 vs 3.67...那个看起来很奇怪
  • 似乎是一个基本的歧义问题:stackoverflow.com/questions/21232733/…
【解决方案2】:
max([int(x) for x in a.split()])

这会将a 转换为整数列表并找到正确的最大值。字符串逐个字符比较,比较字符码。

max(int(x) for x in a.split())

上述方法也可以作为生成器变体,无需创建列表。

【讨论】:

  • 您不需要[] 的列表理解。 max 可以直接取一个生成器表达式
  • 另外,max(map(int, a)) 适用于 Python 3.x 和 2.7,在 3.x 中是惰性的。
  • @sshashank124 感谢您的评论,我编辑了我的答案
  • max 不进行双重生成。你能提供一个来源吗?
  • @sshashank124 显然我找不到。我想到了一个类似的案例,我读到生成器确实使代数增加了一倍。有一个关于此的流行 StackOverflow 条目。然而,这可能是一个类似的案例。与此同时,我一定会修改这个答案。
【解决方案3】:
max(map(int, a.split(" ")))
# 542

【讨论】:

    猜你喜欢
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    相关资源
    最近更新 更多