2017-04-13 98 views
2

让的说我们已经给这个小程序:如何遍历Python中指定范围的列表中的参数?

a = [[70, 19, 54, 7, 63], 
    [78, 72, 93, 78, 33], 
    [83, 55, 57, 9, 22], 
    [95, 64, 90, 91, 54]] 

for x, y, *z in a: 
    print("x = {}, y = {}, z = {}".format(x, y, z)) 

这将会给我的第一个元素在列表a

x = 70, y = 19, z = [54, 7, 63] 

但我要的是定义,有多少元素定义的变量应该有,例如这样的事情:

for x, y[:2], z[:2] in a: 
    print("x = {}, y = {}, z = {}".format(x, y, z)) 

其确实,这不会在python中工作。 (我试过了)

这将是很好,如果有一种方式来做这样的事情在Python中。

我知道我可以做这样的事情:

b = list(zip(*a)) 

c1 = b[0] 
c2 = list(zip(*b[1:3])) 
c3 = list(zip(*b[3:5])) 

for x, y, z in zip(c1, c2, c3): 
    print("x = {}, y = {}, z = {}".format(x, y, z)) 

这将使我在a第一个参数:

x = 70, y = (19, 54), z = (7, 63) 

但对于一个巨大的名单a这是现在这样很高效。

+3

那么为什么不直接从循环中的切片*分配*?对于a,x,y,z =值[0],值[1:3],值[3:5]'中的值。 –

+0

或更好,仍然使用更详细的数据结构,它不会将所有值放入一个长列表中。 –

+0

这会工作,但我认为它可以直接在for循环中执行。 – PiMathCLanguage

回答

2

分配中的*运算符旨在用于捕获列表的“extrenous”元素。它不打算成为模式匹配语言。

的选项有:

  • 产生更多的结构化数据。如果您的输入已经被分组到元组或其他对象中,您可以更容易地在循环中处理它。

  • 提取在循环中的子列表,然后分配:

    for values in a: 
        x, y, z = values[0], values[1:3], values[3:5] 
    
  • 使用发电机表达式重新包装结构;上循环发电机表达发生在平行于遍历所有发电机:

    a_repacked = ((v[0], v[1:3], v[3:5]) for v in a) 
    for x, y, z in a_repacked: 
        # ... 
    

    可以内嵌发电机表达到for循环语句,但可读性,我建议你坚持一个独立的变量。