Python 如何在一行中指定变量中的for循环值
我有下面的代码示例;结合枚举同时迭代多个序列,将值赋给tuple变量,然后输出该变量Python 如何在一行中指定变量中的for循环值,python,python-3.x,optimization,simplify,Python,Python 3.x,Optimization,Simplify,我有下面的代码示例;结合枚举同时迭代多个序列,将值赋给tuple变量,然后输出该变量 def PairValuesWithIndexToTuples(self,val1,val2): t =() for i, (a,b) in enumerate(zip(val1,val2)): t += (i,a,b) return t 如果可能的话,我想要实现的是这样的目标: 我一直在四处搜索,但是我还没有找到一个解决方案,可以通过上面所述的方法获得我的结果: def PairValu
def PairValuesWithIndexToTuples(self,val1,val2):
t =()
for i, (a,b) in enumerate(zip(val1,val2)):
t += (i,a,b)
return t
如果可能的话,我想要实现的是这样的目标:
我一直在四处搜索,但是我还没有找到一个解决方案,可以通过上面所述的方法获得我的结果:
def PairValuesWithIndexToTuples(self,val1,val2):
t =()
t += for i, (a,b) in enumerate(zip(val1,val2))
return t
或
您可以创建一个生成器表达式来创建元组,然后从该表达式获得展平结果
from itertools import chain
tuple(chain.from_iterable((i, a, b) for i, (a,b) in enumerate(zip(val1,val2))))
这看起来比多行函数好得多
def pair_with_index(*its):
e = enumerate(zip(*its))
flattened = ((i, *t) for i, t in e)
c = chain.from_iterable(flattened)
return tuple(c)
pair_with_index([1, 2, 3], [4, 5, 6])
# (0, 1, 4, 1, 2, 5, 2, 3, 6)
编辑:
我的原始代码(用于元组的元组)是
因为这更清楚了
sum(((i, a, b) for i, (a,b) in enumerate(zip(val1, val2))), ())
例如:
val1 = 'hello'
val2 = range(5)
sum(((i, a, b) for i, (a,b) in enumerate(zip(val1, val2))), ())
# -> (0, 'h', 0, 1, 'e', 1, 2, 'l', 2, 3, 'l', 3, 4, 'o', 4)
也许你在寻找一个扁平列表或扁平元组?你的问题不清楚,所以我会把所有的都包括进去
In [79]: val1 = [1,2,3]
In [80]: val2=[4,5,6]
In [81]: [(i, a, b) for i, (a,b) in enumerate(zip(val1,val2))]
Out[81]: [(0, 1, 4), (1, 2, 5), (2, 3, 6)]
In [82]: [k for j in [(i, a, b) for i, (a,b) in enumerate(zip(val1,val2))] for k in j]
Out[82]: [0, 1, 4, 1, 2, 5, 2, 3, 6]
In [84]: tuple(k for j in [(i, a, b) for i, (a,b) in enumerate(zip(val1,val2))] for k in j)
Out[84]: (0, 1, 4, 1, 2, 5, 2, 3, 6)
虽然我不主张滥用
sum
,但这样做是可以将元组连接在一起的
sum(tuples, ())
还是你的情况
sum(((i, a, b) for i, (a, b) in enumerate(zip(val1, val2))), ())
重要的是要注意,考虑到sum的行为,这可能是低效的。在这种情况下,情况就不那么清楚了
注意:我不主张在生产代码中使用此选项。这只是为了表明这是可能的。千万不要要求一条班轮。相反,要求代码简短明了。否则,您应该在enumerate(zip(val1,val2))中使用
exec('for i,(a,b)):\nt+=(i,a,b);')
。这是一个不同的结果-您有一个元组而不是一个值元组。@FHTMitchell已修复。感谢@PatrickHaugh的评论。我实际上是在寻找一组元组,但我想知道我是否可以以一种更优化的方式重写代码。因此,与5行代码不同,我只能有2行或3行代码。查看我的第一个被剪断的代码,我想知道我是否可以实现以下功能:def PairValuesWithIndexToTuples(self,val1,val2):在enumerate(zip)中为I(a,b)返回t+=或def PairValuesWithIndexToTuples(self,val1,val2):在enumerate(zip)中为I(a,b)返回t=()(val1,val2)返回t@nclaudiuf“我的编辑”的输出是否更符合您的要求?发布带有拼凑语法的示例的问题在于,我不确定您要查找的结果。您能否提供示例输入/输出?functools.reduce(lambda,b:a+b,((I,a,b)表示I,(a,b)在enumerate(zip(val1,val2))中)
在这里更快——我认为求和(x,[])
是O(n^2)@MoxieBall我错了,functools.reduce不是更快。itertools.chain是最好的选择……你刚刚复制了我的answer@FHTMitchell@FHTMitchell不,我们只是在30秒内回答了对方。当我点击提交时,你的回答弹出为“新答案”:@我愿意收回我的回答,但我没有抄袭你的。我对这项指控感到愤慨,因为他们在几秒钟之内就互相提交了评论@Acharya。很高兴知道我也能做到这一点。我想得到一个元组的返回。但我只是想在尽可能短的代码量内优化我的代码。你可以看看我贴给帕特里克的评论
sum(tuples, ())
sum(((i, a, b) for i, (a, b) in enumerate(zip(val1, val2))), ())