考虑两个列表推导gamma
和delta
几乎冗余的代码。区别在于切片列表alpha
和beta
,即
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 = ...
)?
我还有一些其他类似的代码,我希望简化代码的冗余。
答案 0 :(得分:8)
尽管单行list-comprehensions
非常有用,但它们并不总是最佳选择。所以这里因为你对lists
进行同样的分块,如果你想改变分块,你必须修改两行。
相反,我们可以使用function
来对任何给定的list
进行分块,然后使用单行分配来分块gamma
和delta
。
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)