我有一个简单的程序,可以读取数字并按顺序返回:
import sys
myset = set()
arguments = sys.argv[1:]
for x in arguments:
myset.add(int(x.rstrip()))
newset = sorted(myset)
print ("sorted")
for x in newset:
print x
当我键入"python-pysortints.py 1 5 6 7 2 6 7 254 2 543"时,它非常有效,但当我尝试类似"pythont-pysortins.py<testfile"(当testfile是纯数字行时)的东西时,除了一些打印语句("sorted")外,什么都不会出现。
有什么想法吗?我试着在x上rstrip以防万一,但它似乎没有任何作用。
进行时
pysortints.py < testfile
testfile
的内容在标准输入中变得可用而不是作为命令行参数。
因此,您需要使用raw_input
(如果使用Python 2.x)或input
(如果使用Python3.x)函数读取数据。
或者,您可以直接从sys.stdin
读取,就像这个一样
import sys
for x in sys.stdin:
myset.add(int(x))
注意:您不需要剥离传递给int
函数的字符串数据。它将忽略开头和结尾的空白字符,对您来说:)
让我们稍微改进一下代码。你的意图是只找到独特的元素并对它们进行排序。因此,你可以使用集合理解,而不是向集合中添加元素,比如这个
{int(line) for line in sys.stdin}
这将获得int类型中的所有唯一元素。接下来,您可以简单地将sorted
应用于
print sorted({int(line) for line in sys.stdin})
如果你想在新行中打印每一行,就像你在示例中所做的那样,你可以使用map
和str
函数将排序后的数字转换为字符串,就像这个
map(str, sorted({int(line) for line in sys.stdin}))
然后你可以将它们与n
连接在一起并打印出来,就像这个一样
print "n".join(map(str, sorted({int(line) for line in sys.stdin})))
给你!您的整个程序在一行中。:):)
您需要读取STDIN
,而不是参数:
import sys
for line in sys.stdin:
print line.rstrip()
除了的建议,还建议您可以在不修改的情况下运行脚本。为此,您需要将文件的内容作为参数传递(而不是使用"<"作为标准输入)。您可以在xargs
命令的帮助下完成此操作:
cat testfile | xargs python pysortints.py
如果您仍然想使用<
重定向,请注意拆分从文件中读取的行:
myset = set()
for line in sys.stdin:
for x in line.split():
myset.add(int(x))