一行代表几乎冗余的列表理解

时间:2017-12-31 09:06:46

标签: python python-3.x list-comprehension

考虑两个列表推导gammadelta几乎冗余的代码。区别在于切片列表alphabeta,即

gamma = [alpha[i:i+30] for i in range(0,49980,30)]
delta = [beta[i:i+30] for i in range(0,49980,30)]

是否有一种pythonic方式将其写为一个班轮(比如说gamma,delta = ...)?

我还有一些其他类似的代码,我希望简化代码的冗余。

4 个答案:

答案 0 :(得分:8)

尽管单行list-comprehensions非常有用,但它们并不总是最佳选择。所以这里因为你对lists进行同样的分块,如果你想改变分块,你必须修改两行。

相反,我们可以使用function来对任何给定的list进行分块,然后使用单行分配来分块gammadelta

def chunk(l):
    return [l[i:i+30] for i in range(0, len(l), 30)]

gamma, delta = chunk(gamma), chunk(delta)

答案 1 :(得分:4)

至于您的问题与上述列表理解表达式的组合有关,您可以使用zip与单t& operator [] (string s) { bool nu = true; for (auto& e : actual) // for each pair if (e.first == s) // if exist nu = false; if (nu == true) { // if needs created actual.push_back(pair <string, t>()); // create proper pair actual.back().first = s; // assign key lookup[s] = actual.size()-1; // assign proper index in map @ same key } return actual[lookup[s]].second; // return reference to value } gamma 列表理解为:

delta

展示gamma, delta = zip(*[(alpha[i:i+30], beta[i:i+30]) for i in range(0,50000,30)]) 工作原理的示例:

zip

这里我们的列表理解将返回元组列表:

>>> zip(*[(i, i+1) for i in range(0, 10, 2)])
[(0, 2, 4, 6, 8), (1, 3, 5, 7, 9)]

然后我们使用>>> [(i, i+1) for i in range(0, 10, 2)] [(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)] 解压缩此列表并使用zip我们聚合来自每个迭代的元素:

*

作为替代方案,要将列表划分为大小均匀的块,请查看"How do you split a list into evenly sized chunks?"

答案 2 :(得分:1)

另一种方式......

genny 3.439506340350704
zippy 4.3039169818228515

它比接受的zip解决方案快一点:

from timeit import timeit
alpha = list(range(60000))
beta = list(range(60000))
def genny():
    gamma, delta = ([src[i:i+30] for i in range(0,49980,30)] for src in (alpha, beta))
def zippy():
    gamma, delta = zip(*[(alpha[i:i+30], beta[i:i+30]) for i in range(0,50000,30)])
n = 1000
print('genny', timeit(genny, number=n))
print('zippy', timeit(zippy, number=n))

代码:

{{1}}

答案 3 :(得分:0)

你可以使用lambda表达式:

g = lambda l: [l[i:i+30] for i in range(0,50000, 30)]
gamma, delta = g(alpha), g(beta)