Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在一行中指定变量中的for循环值_Python_Python 3.x_Optimization_Simplify - Fatal编程技术网

Python 如何在一行中指定变量中的for循环值

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

我有下面的代码示例;结合枚举同时迭代多个序列,将值赋给tuple变量,然后输出该变量

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))), ())