【问题标题】:Picking values from the list - how to make it more efficient [duplicate]从列表中选择值 - 如何提高效率 [重复]
【发布时间】:2019-07-09 11:51:16
【问题描述】:

我正在尝试从列表中选择 8 个值并将它们分配给变量。如何简化它,使其更高效。

我不够具体。我想从列表的开头选择 8 个值,进行操作,将其添加到结果中,然后从列表中选择下一个 8 个数字,依此类推,直到列表的末尾

input_data = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]
index=0
for n in range(int(len(input_data)/8)):
        v1=input_data[n+index]
        x1=input_data[n+1+index] 
        y1=input_data[n+2+index]
        z1=input_data[n+3+index]
        v2=input_data[n+4+index]
        x2=input_data[n+5+index] 
        y2=input_data[n+6+index]
        z2=input_data[n+7+index]
        index+=7
        print(v1,x1,y1,z1,v2,x2,y2,z2)

【问题讨论】:

标签: python


【解决方案1】:

如果目标只是打印,您可以使用slicing

start_index = -8
print(input_data[start_index:])

如果您想分配它们,您可以使用list 来存储稍后可以单独提取的值。

vars_list = []
for i in range(start_index, 0):
    vars_list.append(input_data[i])


print(vars_list[0])
print(vars_list[1])
print(vars_list[2])
print(vars_list[3])
print(vars_list[4])
print(vars_list[5])
print(vars_list[6])
print(vars_list[7])

输出:

[17, 18, 19, 20, 21, 22, 23, 24]
17
18
19
20
21
22
23
24

编辑:

更简单的单线杀手:

start_index = -8
for i in range(len(input_data)//8): v1, x1, y1, z1, v2, x2, y2, z2 = input_data[start_index:]

print(v1, x1, y1, z1, v2, x2, y2, z2)

输出:

17 18 19 20 21 22 23 24

【讨论】:

    【解决方案2】:

    您无法在速度方面优化变量分配,但您可以在可读性方面进行优化:

    input_data = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]
    for n in range(len(input_data)//8):
        v1, x1, y1, z1, v2, x2, y2, z2 = input_data[n*8:(n+1)*8]
    

    【讨论】:

    • 我正在看这个,它看起来更好,它更短。我只需要捕捉方括号内发生的事情
    • 注意//的使用。整数除法,这不会四舍五入,也就是说如果你有七个元素,它不会进入循环。
    【解决方案3】:

    假设input_data的固定长度:

    for i in range(3):
        v1,x1,y1,z1,v2,x2,y2,z2 = input_data[i*8:(i+1)*8]
        print(v1,x1,y1,z1,v2,x2,y2,z2)
    

    input_data 的长度不定(但为 8 的倍数):

    for i in range(0,len(input_data), 8):
        v1,x1,y1,z1,v2,x2,y2,z2 = input_data[i:i+8]
        print(v1,x1,y1,z1,v2,x2,y2,z2)
    

    所有的打印都和 OP 的一样

    1 2 3 4 5 6 7 8
    9 10 11 12 13 14 15 16
    17 18 19 20 21 22 23 24
    

    【讨论】:

      【解决方案4】:

      在python中我们可以这样做

      input_data = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]
      temp=input_data
      randomly_picked=[]
      
      for i in range(len(input_data)):
          v1,v2,v3,v4,v5,v6,v7,v8 = input_data[i:i+8]
      

      【讨论】:

        【解决方案5】:

        这提高了一些可读性:

        input_data = range(1,25)
        data = iter(input_data)
        for v1, x1, y1, z1, v2, x2, y2, z2 in zip(*[data]*8):
             print(v1, x1, y1, z1, v2, x2, y2, z2)
        

        打印:

        1 2 3 4 5 6 7 8
        9 10 11 12 13 14 15 16
        17 18 19 20 21 22 23 24
        

        我问了question,得到了非常相似的回答。

        【讨论】:

          【解决方案6】:

          你可以这样做:

          from random import sample 
          list = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24] 
          values = sample(list, 8) 
          for x in values:     
              print(x)
          

          这将从您的列表中随机选择八个数字,然后 for 循环将打印它们。

          【讨论】:

          • 我不相信这就是 OP 想要的。我第一次读的时候也是这么想的。
          猜你喜欢
          • 2020-07-27
          • 1970-01-01
          • 1970-01-01
          • 2023-03-03
          • 1970-01-01
          • 2019-04-27
          • 1970-01-01
          • 2020-01-30
          • 1970-01-01
          相关资源
          最近更新 更多