我想编写一个执行以下操作的程序:-
示例输入:
3
10 4 18 2 6 19 24 1 20
预期输出:
4 2 2 2 6 1 1
输入将来自一个文件,其中第一行将包含窗口大小 N,第二行将包含一串由空格分隔的数字。您需要输出每个窗口中以空格分隔的最小数字。
这是我写的:-
with open ("file") as f1:
n = int(f1.readline())
numbers = f1.readline()
# converting the string of numbers into a list
numbers_list = map(int,numbers[:-1].split(' '))
# getting all the sub-lists of size n from the numbers_list and printing their respective minimum elements.
print [min(numbers_list[i:i+n]) for i in xrange(len(numbers_list)-n+1)]
我的 o/p
[4, 2, 2, 2, 6, 1, 1]
还有比这更好的解决方案吗?此解决方案的任何优化版本。
最佳答案
map(min, [nums[x:x+window] for x in xrange(len(nums)-(window-1))])
但是,这会创建一个中间列表,因此:
[min(nums[x:x+window]) for x in xrange(len(nums)-(window+1))]
实际上更好,这就是您目前拥有的。
有一种更省时的方法,但是,它需要更多的代码。获得窗口的最小值后,您所做的就是查看下一个槽,因此您需要做的就是将前一个 (window-1) 元素的最小值与下一个值进行比较。结果列表中的下一个数字将以较小者为准。重复。
例如,如果您有一个四元素列表并且您的窗口大小为 3。结果列表中的第一个值将是前三个元素中的最小值,结果列表中的第二个值将是前三个元素中的最小值最后三个元素。
那里有两个元素重叠。因此,您可以保存最后一个 window-1 元素的最小值,并将其与列表中的下一个值进行比较,以获得下一个窗口的最小值。重复。
关于文件处理,
with open ("file") as f1:
n = int(f1.readline())
numbers_list = map(int, f1.readline().split(' '))
效率稍微高一些。
关于Python-算法语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20417925/