如何在Python中创建一个遍历列表的函数?

时间:2019-05-03 16:32:45

标签: 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)]

A,Updater不起作用,因为它仅执行第一次迭代,因此index等于1,尽管它应该等于13sensor1sensor2的长度。

  • 我在做什么错了?
  • 如何使此特定代码段在函数中工作?

4 个答案:

答案 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])