如何在一行中的变量中分配for循环值

时间:2018-07-20 16:17:25

标签: python python-3.x optimization simplify

因此,我有以下代码示例;同时迭代与枚举结合的多个序列,将值分配给元组变量,然后将其输出。

public class AlarmReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {

        MediaPlayer player = MediaPlayer.create(context, R.raw.alarmtone);

        String alarmAction = intent.getAction();
        if (alarmAction.equals("ALARM_ON")) {
            Intent intent1 = new Intent(context, WakeUpScreen.class);
            context.startActivity(intent1);

            player.setLooping(true);
            player.setVolume(100, 100);
            player.start();

        } else if (alarmAction.equals("ALARM_OFF")) {
            player.stop();
            player.release();
        }
    }
}

如果可能,我想实现的目标是这样的: 我一直在搜索,但是找不到通过以上方法实现结果的解决方案:

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

4 个答案:

答案 0 :(得分:0)

您可以创建一个生成器表达式来创建元组,然后从该表达式chain.from_iterable中获取平坦化的结果

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)

编辑:

我的原始代码(用于一个元组)是

def pair_with_index(val1, val2):
    return tuple((i, a, b) for i, (a,b) in enumerate(zip(val1,val2)))

pair_with_index([1, 2, 3], [4, 5, 6])
# ((0, 1, 4), (1, 2, 5), (2, 3, 6))

答案 1 :(得分:0)

也许您在寻找一个扁平化的列表或扁平化的元组?您的问题不清楚,所以我只介绍所有内容。

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)

答案 2 :(得分:-2)

因为这很清楚...

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)

答案 3 :(得分:-2)

虽然我不主张滥用sum,但可以这样做以将元组连接在一起

sum(tuples, ())

或者您的情况

sum(((i, a, b) for i, (a, b) in enumerate(zip(val1, val2))), ())

重要的是要注意,鉴于求和的行为,这可能效率很低。在这种情况下还不太清楚。

注意:我不主张在生产代码中使用它。仅仅是为了证明这是可能的。