- 如何在python中生成循环遍历列表的函数?

我用两个独立的传感器进行测量, 由于某种原因,其中一个传感器在测试过程中坏了,我想创建一个新列表,其中五个包含sensor1的第一个元素和其余来自sensor2的元素。我设法通过以下方式完成此操作:


updated = [] 


index = 0


while index <len(sensor1):


 if index <= 2:


 updated.append(sensor1[index])


 elif index> 2:


 updated.append(sensor2[index])


 else:


 print('You did something wrong, you ignorant fool!')


 index += 1



不过为了更熟悉python我将把它转换为名为Updater的函数


def Updater(one, two, divide):


 updated = []


 index = 0


 while index <len(one):


 if index <= divide:


 updated.append(one[index])


 elif index> divide:


 updated.append(two[index])


 else:


 print('You did something stupid, you ignorant fool!')


 index += 1


 return updated



这是我的调用


data = Updater(one=sensor1, two=sensor2, divide=4)



或者


data = [Updater(a, b, divide=4) for a, b in zip(sensor1, sensor2)]



唉,Updater不起作用,因为它只执行第一次迭代,所以索引等于1,尽管它应该等于13,这是sensor1和sensor2的长度。

  • 我做错什么了?
  • 我如何使这个特定的代码在函数中工作?
时间:

使用当前脚本 :


sensor_1 = [1,2,3,4,5]



sensor_2 = [6,7,8,9,20,22,23]



def Updater(one, two, divide):


 updated = []


 index = 0


 while index <len(one):


 if index <= divide:


 updated.append(one[index])


 elif index> divide:


 updated.append(two[index])


 else:


 print('You did something stupid, you ignorant fool!')


 index += 1


 return updated



print(Updater(sensor_1, sensor_2, 2))



我们得到以下输出:

 
[1]



 

这是因为return语句在循环内,一旦执行一个循环后,它将返回sensor_1中的第一个元素, 但是,将return语句推回一个缩进级别 :


sensor_1 = [1,2,3,4,5]



sensor_2 = [6,7,8,9,20,22,23]



def Updater(one, two, divide):


 updated = []


 index = 0


 while index <len(one):


 if index <= divide:


 updated.append(one[index])


 elif index> divide:


 updated.append(two[index])


 else:


 print('You did something stupid, you ignorant fool!')


 index += 1


 return updated



print(Updater(sensor_1, sensor_2, 2))



输出:


[1, 2, 3, 9, 20]



问题是,你在第一个迭代上返回 updated

而且,你可以做到


result = one[:divide] + two[divide:]



我将使用itertools模块中已有的工具:


from itertools import chain, islice



def updater(one, two, divide):


 # Similar to return one[:divide] + two[divide:]


 return list(chain(islice(one, divide), islice(two, divide, None)))



islice(one,divide)产生一个的前5个元素; islice(two,divide,None)从第六个元素开始产生一切从两个元素开始。链将两个迭代器连接在一起,列表构建迭代结果,并且从看到的元素构建一个列表。

slice将在连接它们之前创建(部分)的副本, islice只返回一个迭代器,它只能在没有任何复制的情况下, 这也适用于任意的iterables,而不仅仅是列表 。

您还可以推迟为调用者创建具体列表,


def updater(one, two, divide):


 return chain(islice(one, divide), islice(two, divide, None))



updated = list(updater(one, two, divide))



如果您从未真正需要结果的内存中的完整列表,例如,如果您只计划迭代它,那么这非常有用,


for x in updater(one, two, 5):


 . ..



我认为你不需要,如果你想要的只是采取一个子列表,你可以像下面这样轻松地做到这一点,假设你有10个元素,


>>> updated.append(sensor1[0:6])


>>> updated.append(sensor2[6:10])



...