我用两个独立的传感器进行了测量。由于某种原因,其中一个传感器在测试期间变坏了,我想创建一个新列表,其中包含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)]
A,Updater
不起作用,因为它仅执行第一次迭代,因此index
等于1
,尽管它应该等于13
, sensor1
和sensor2
的长度。
答案 0 :(得分:9)
问题是您在第一次迭代中返回了updated
。
此外,您可以做
result = one[:divide] + two[divide:]
答案 1 :(得分:3)
使用当前脚本:
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
语句位于while循环内,因此一旦执行了循环,它将返回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]
答案 2 :(得分:2)
我将使用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)
产生one
的前5个元素; islice(two, divide, None)
从two
开始产生第六个元素。 chain
将两个迭代器连接在一起,而list
对结果进行迭代,并根据看到的元素构建一个列表。
切片将在串联之前创建列表(的一部分)的副本。 islice
只是返回一个迭代器,该迭代器仅产生请求元素,而不进行任何复制。这也适用于任意可迭代对象,而不仅仅是列表。
您还可以将创建具体列表的决定推迟给呼叫者:
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):
...
答案 3 :(得分:1)
我认为您不需要,只要您想要一个子列表,就可以轻松地像下面这样,假设您有10个元素:
>>> updated.append(sensor1[0:6])
>>> updated.append(sensor2[6:10])