Python循环等效Excel偏移等效?

cig3rfwq  于 2023-02-21  发布在  Python
关注(0)|答案(3)|浏览(101)

我是Python编程新手,正在尝试编写一个For/While循环,该循环基于循环中的当前值返回列表中相对于另一个值的值。我能想到的与excel最接近的类似函数是OFFSET函数,但我的搜索没有找到答案。此外,我相信excel中的VBA允许您使用相对单元格,而不是绝对单元格。也许这是一个更好的类似函数。
例如:
假设我有一个简单的列表abc =[2,5,21,54,23,12,23],我想创建一个变量,它是循环中的当前值除以先前值,所以在这个例子中,5除以2,21除以5,等等。
代码示例如下所示:

for val in abc:
     xyz = val/val[-1]
     print(xyz)

我知道我需要为第一次迭代编写一个异常,语法是不正确的,但我只是想传达我的信息。
我的搜索发现,Pandas有能力做到这一点,但我想知道是否有可能没有Pandas。将不胜感激的任何投入。

3ks5zfa0

3ks5zfa01#

你不能只按值循环,因为值没有它在列表中位置的上下文。一种方法是按索引循环:

# start from 1, not 0
for i in range(1, len(abc)):
    xyz = abc[i] / abc[i - 1]
    print(xyz)

或者,zip列表及其尾部:

for prev, cur in zip(abc, abc[1:]):
    xyz = cur / prev
    print(xyz)

直觉告诉我们为什么会这样:

prev
             v
abc     -> 1 2 3 4 5 6 7
abc[1:] -> 2 3 4 5 6 7
             ^
            cur
tv6aics1

tv6aics12#

您可以使用enumerate来执行此操作:

abc = [2,5,21,54,23,12,23]

for index, val in enumerate(abc):
    print("VALUE: {}, PREVIOUS: {}, RESULT: {}".format(val, abc[index-1], val/abc[index-1]))

然而,这里有一个陷阱,Python可以有负索引,它会在列表的另一边绕圈,如果你做了上面的操作,第一次通过循环你会看到它这样做:

VALUE: 2, PREVIOUS: 23, RESULT: 0.08695652173913043

为了避免这种情况,你可以这样做:

abc = [2,5,21,54,23,12,23]

for index, val in enumerate(abc):
    if index > 0:
        print("VALUE: {}, PREVIOUS: {}, RESULT: {}".format(val, abc[index-1], val/abc[index-1]))
    else:
        print("First Value")

导致以下输出:

First Value
VALUE: 5, PREVIOUS: 2, RESULT: 2.5
VALUE: 21, PREVIOUS: 5, RESULT: 4.2
VALUE: 54, PREVIOUS: 21, RESULT: 2.5714285714285716
VALUE: 23, PREVIOUS: 54, RESULT: 0.42592592592592593
VALUE: 12, PREVIOUS: 23, RESULT: 0.5217391304347826
VALUE: 23, PREVIOUS: 12, RESULT: 1.9166666666666667
xhv8bpkk

xhv8bpkk3#

Python样式:

abc = [2,5,21,54,23,12,23]

gen = (abc[i + 1] / v for i, v in enumerate(abc) if i + 1 < len(abc))

for i in gen:
    print(i)

结果:

2.5
4.2
2.5714285714285716
0.42592592592592593
0.5217391304347826
1.9166666666666667

相关问题