循环遍历列表并使用以前的元素

时间:2013-05-01 13:15:52

标签: python

我有一个包含十进制数的列表,但在本例中我使用了int:

my_list = [40, 60, 100, 240, ...]

我想以相反的顺序打印列表中的每个元素,之后我想打印第二行,其中每个值除以2,然后是第三行,其中前一个int除以3,依此类推......

输出应为:

240     120     60     36
120      60     30     18  #previous number divided by 2
 40      20     10      6  #previous number divided by 3
...     ...     ...    ... #previous number divided by 4 ...

我的解决方案很难看:我可以创建一个切片并反转该列表并为循环创建n并将结果附加到新列表中。但必须有更好的方法。你会怎么做?

5 个答案:

答案 0 :(得分:4)

我会编写一个生成器来依次产生列表:

def divider(lst,n):
    lst = [float(x) for x in lst[::-1]]
    for i in range(1,n+1):
        lst = [x/i for x in lst]
        yield lst

更合适。如果我们想让它稍微提高效率,我们可以将第一次迭代分解(除以1)并单独产生它:

def divider(lst,n):
    lst = [float(x) for x in reversed(lst)]
    yield lst
    for i in range(2,n+1):
        lst = [x/i for x in lst]
        yield lst

*请注意,在此上下文中,lst[::-1]reversed(lst)之间没有太大区别。前者通常要快一点,但后者的内存效率要高一些。根据您的限制选择。


演示:

>>> def divider(lst,n):
...     lst = [float(x) for x in reversed(lst)]
...     yield lst
...     for i in range(2,n+1):
...         lst = [x/i for x in lst]
...         yield lst
... 
>>> for lst in divider([40, 60, 100, 240],3):
...     print lst
... 
[240.0, 100.0, 60.0, 40.0]
[120.0, 50.0, 30.0, 20.0]
[40.0, 16.666666666666668, 10.0, 6.666666666666667]

答案 1 :(得分:2)

要打印列所需的输出,请使用format strings。您可能需要调整它以获得实际数据所需的对齐和精度:

def print_list(L):
    print '    '.join('{:>3d}'.format(i) for i in L)

通常要进行除法我们可以使用带递归的函数,但我们也可以使用一个简单的循环,其中每次迭代产生下一个工作的列表:

my_list = [40, 60, 100, 240, 36, 60, 120, 240]

maxdiv = 20
baselist = list(reversed(my_list))
for div in range(1, maxdiv+1):
    baselist = [i/div for i in baselist]
    print_list(baselist)

输出:

240    120     60     36    240    100     60     40
120     60     30     18    120     50     30     20
 40     20     10      6     40     16     10      6
 10      5      2      1     10      4      2      1
  2      1      0      0      2      0      0      0
  0      0      0      0      0      0      0      0
  0      0      0      0      0      0      0      0
  0      0      0      0      0      0      0      0
...

答案 2 :(得分:1)

max_n = 3
vals  = [40, 60, 100, 240]
grid  = [list(reversed(vals))]

for n in xrange(2, max_n + 1):
    grid.append([v/n for v in grid[-1]])

for g in grid:
    print g

# Output
[240, 100, 60, 40]
[120.0, 50.0, 30.0, 20.0]
[40.0, 16.666666666666668, 10.0, 6.666666666666667]

答案 3 :(得分:0)

new_list = my_list[::-1] #reverse the list
print '\t'.join(map(str, new_list))
for _counter in range(2, 21): #count from 2 to 20
    for _index in range(len(new_list)): # iterate the whole list
        new_list[_index] = new_list[_index]/_counter
        print '\t'.join(map(str, new_list))

会生成类似的输出(我使用float代替int):

240.0       100.0         60.0         40.0
120.0        50.0         30.0         20.0
40.0        16.6666666667 10.0         6.66666666667
10.0        4.16666666667 2.5          1.66666666667
2.0         0.833333333333 0.5         0.333333333333

答案 4 :(得分:-2)

my_list = [40, 60, 100, 240]
def dostuff(l,limit):
    print('\t'.join(map(str,reversed(l))))
    print('\n'.join([ '\t'.join(map(str,[v/float(i) for v in reversed(my_list)])) for i in range(2,limit+1)]))
dostuff(my_list,20)

产地:

240 100 60  40
120.0   50.0    30.0    20.0
80.0    33.333333333333336  20.0    13.333333333333334
60.0    25.0    15.0    10.0
48.0    20.0    12.0    8.0
40.0    16.666666666666668  10.0    6.666666666666667
34.285714285714285  14.285714285714286  8.571428571428571   5.714285714285714
30.0    12.5    7.5 5.0
26.666666666666668  11.11111111111111   6.666666666666667   4.444444444444445
24.0    10.0    6.0 4.0
21.818181818181817  9.090909090909092   5.454545454545454   3.6363636363636362
20.0    8.333333333333334   5.0 3.3333333333333335
18.46153846153846   7.6923076923076925  4.615384615384615   3.076923076923077
17.142857142857142  7.142857142857143   4.285714285714286   2.857142857142857
16.0    6.666666666666667   4.0 2.6666666666666665
15.0    6.25    3.75    2.5
14.117647058823529  5.882352941176471   3.5294117647058822  2.3529411764705883
13.333333333333334  5.555555555555555   3.3333333333333335  2.2222222222222223
12.631578947368421  5.2631578947368425  3.1578947368421053  2.1052631578947367
12.0    5.0 3.0 2.0