Kev*_* Jr 5 python list-comprehension deque python-3.x
有没有办法做类似的事情
\nsome_list = [int(x) for x in input().split()]\nRun Code Online (Sandbox Code Playgroud)\n但返回一个collections.deque对象而不是列表?\xc2\xa0 特别是,我试图避免创建列表并将其转换为deque(some_list)因为这会增加 O(n) 的时间复杂度,如此处所示并在此处解释。
我正在研究一个 HackerRank 问题的练习(但会避免在这里分享,以避免人们破坏寻找答案的乐趣)。\xc2\xa0 因此,我不会给出示例输出因为它只有在问题的完整背景下才有意义。\xc2\xa0 然而,我可以透露一些相关的事情,但不会冒剧透的风险。
\n我正在通过 stdin 接收非常大的列表/双端队列(最多 100k 个元素)。\xc2\xa0 它们需要在读入之后(或同时)转换为整数。
\n列表/双端队列本身中的元素介于 1 和 2 31之间。
\n我需要快速比较并从两端弹出。\xc2\xa0不需要(a)查看数据中间,也不需要(b)对其进行排序。
\n我只能使用 stdin 来获取数据,但我会提前知道列表/双端队列的大小。\xc2\xa0
\n快速的运行时执行是我们所希望的,但不幸的是我无法使用 Numpy、Pandas 和 Numba 来提供帮助。
\n由于(3)和(5),似乎该deque对象是最好的方式。\xc2\xa0 由于(1)和(5),我想立即将输入转换为整数这就是为什么我想到了列表推导式。\xc2\xa0
第一行n告诉我第二行有多少个整数。
4\n5 2 42 199\nRun Code Online (Sandbox Code Playgroud)\n以下代码用于读取输入并将其转换为整数:
\n4\n5 2 42 199\nRun Code Online (Sandbox Code Playgroud)\n但正如前面提到的,我想立即将输入转换为整数,同时创建deque并完全跳过列表(出于性能速度原因)。\xc2\xa0
也许我错误地认为立即将来自 stdin 的字符串输入转换为整数并将它们存储在 a 中deque会更快:
n = int(input())\nwish_this_was_a_deque = [int(x) for x in input().split()]\nRun Code Online (Sandbox Code Playgroud)\n如果是这样,即使有一种方法可以进行“双端队列理解”,请随时纠正这个误解。\xc2\xa0
\n无论如何,我仍然对“双端队列理解”是否可能感兴趣。
\nPython 提供了几种类型的推导式,但最通用的形式是生成器推导式。当你写的时候
[int(x) for x in input().split()]
Run Code Online (Sandbox Code Playgroud)
这会立即生成一个列表。但没有括号
int(x) for x in input().split()
Run Code Online (Sandbox Code Playgroud)
这是生成器理解。它生成一个惰性迭代,在评估时将生成值。就好像我们写过一样
def my_generator():
for x in input().split():
yield int(x)
my_generator()
Run Code Online (Sandbox Code Playgroud)
但要短得多。现在,它有用的原因是deque,像许多内置的 Python 集合一样,将任意可迭代对象作为其构造函数参数。生成器是一种可迭代的类型。因此,要摆脱中间列表,请进行列表理解
some_big_deque = deque([int(x) for x in input().split()])
Run Code Online (Sandbox Code Playgroud)
并取下括号
some_big_deque = deque(int(x) for x in input().split()) # Look, Ma, no brackets!
Run Code Online (Sandbox Code Playgroud)