【问题标题】:Sort arbitrary values given from command line对从命令行给出的任意值进行排序
【发布时间】:2016-06-02 20:10:29
【问题描述】:

我需要能够在命令行中以任意顺序接受任意值(整数、浮点数),然后对其进行排序和打印。我可以只用整数或浮点数轻松做到这一点,但我一直试图阅读两者。我的 args 读数显示为 Namespace(floats=[6.5], integers=[5, 10, 8, 4])。我需要将所有这些数字放入一个列表中,然后按排序打印。有关如何解决此问题的建议?

我遇到的一个问题是参数必须按特定顺序排列,整数必须在前,然后是浮点数,但我需要能够以任何顺序输入它们。

举个例子。

$ sortNum.py 5 9.9 14 1.1
1.1, 5, 9.9, 14

我的代码如下:

try:
    parser = argparse.ArgumentParser(description='Sort some arbitrary numbers by ascending or descending order')
    parser.add_argument('integers', metavar='N', type=int, nargs='+', help='numbers for the sorter')
    parser.add_argument('floats', metavar='F', type=float, nargs='+', help='floats for the sorter')

    args = parser.parse_args()

    # print the sorted values of user input from cmd line
    print(sorted(args.integers + args.floats))

    # print all the sys argument passed from cmd line including the program name
    print(sys.argv)

except:
    e = sys.exc_info()[0]
    print(e)

我收到此错误: sortNum.py:错误:参数 N:无效的 int 值:'1.1' 当我尝试输入 1.1 作为我的第二个参数时。我正在使用以下参数进行测试:5 1.1 10 8 4 6.5 数值本身并不重要,只是它们可以是任何浮点数或整数并且需要排序。

【问题讨论】:

  • sorted(args.floats + args.integers)?鉴于您没有实际展示您的代码,因此很难提出更有用的建议。
  • 好的,谢谢!这是我的第一个 python 程序(在 hello world 之外)。感谢您的帮助!
  • 不要在问题中加入答案(或“已回答”),以后再给出minimal reproducible example。另外,请注意:blog.codekills.net/2011/09/29/the-evils-of--except--
  • 好的,问题仍然存在。我不能按任何顺序排列数字。在这种情况下,数字必须是整数和浮点数,但它需要能够以任何顺序接受它们。
  • 然后edit 的问题,注意How to Ask。

标签: python sorting floating-point int


【解决方案1】:

在 python 中,你可以访问参数,这要归功于 sys.做吧:

import sys
print sys.argv 

它应该以正确的顺序显示所有参数,事实是您将在 argv 列表中有文件名,这很糟糕!

所以你可以删除它,感谢

numbers = sys.argv[1:]

这将是没有第一个元素的副本。

然后你可以通过这段代码对元素进行排序:

print sorted(numbers, key=lambda x: float(x))

它的作用是对元素进行排序,而不是考虑元素本身,而是根据它们的浮点值进行排序。

你的脚本可以这样写:

import sys

print sys.argv
numbers = sys.argv[1:]
print sorted(numbers, key=lambda x: float(x))

我们在这里,希望它对您有所帮助!

【讨论】:

  • 这很有帮助,我唯一的问题是当我尝试添加一个浮点数,然后是另一个整数时,它显示无效值。我需要更改解析器参数吗?
  • 我想我可能需要将值作为某种通用对象接受,然后将它们强制转换,但我认为这可能有点过火了。
  • 没关系,我是根据你的回答知道的。我只需要删除参数解析器。他们把它扔掉了。谢谢!!
  • 抱歉,我错过了您所做的编辑。我看了看,我认为你不能用 argparse 做你想做的事,因为要么你必须定义你正在等待的确切数量,要么它不起作用。发生的事情是参数名称中没有“--”。 Argparse 将其视为位置。为了克服这个问题,您添加了 nargs=+ ,这不是一个坏主意!问题是 argparse 以两个不同类型的未定义大小的位置参数结束。
  • 因此解决方案是添加位置参数(“只需通过 --intergers 重命名整数并通过 --floats 重命名浮点数”)参数,但在这种情况下,您不能混合浮点数和整数。或者您可以删除所有 argparse 并按照您的建议自行混合! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2011-01-13
  • 1970-01-01
  • 2014-04-20
  • 2020-07-08
  • 2012-10-25
  • 2015-06-25
相关资源
最近更新 更多