通过使用while循环生成列表进行水平分析

时间:2012-12-16 03:54:33

标签: list python-2.7 while-loop

给出以下列表清单:

[[0.074,0.073,0.072,0.03,0.029,0.024,0.021,0.02],[0.02,0.02,0.015],[0.026,0.026,0.02,0.02,0.02,0.015],[0.021,0.021,0.02] ,0.017],[0.077,0.076,0.074,0.055,0.045,0.021],[0.053,0.052,0.051,0.023,0.022],[0.016,0.016]]

我如何在列表中循环并从子列表中的每个子列表#2中取出#1,从每个子列表中取出#3,并生成单独的列表。

例如,在这种情况下,#1应包括0.074,0.02,0.026,0.021,0.077,0.063和0.016。它们将在一个单独的列表中。

我使用了while循环,但它对我不起作用:

a=0
b=len(data['stock'])

while a<=b - 1:
    print data['stock'][a][0]
            a = a + 1
    print "\n"


while a<=b - 1:
    print data['stock'][a][1]
        a = a + 1
print "\n"

while a<=b - 1:
    print data['stock'][a][2]
        a = a + 1
print "\n"

while a<=b - 1:
    print data['stock'][a][3]
        a = a + 1
print "\n"

while a<=b - 1:
    print data['stock'][a][4]
        a = a + 1
print "\n"

while a<=b - 1:
    print data['stock'][a][5]
        a = a + 1
print "\n"

while a<=b - 1:
    print data['stock'][a][6]
        a = a + 1
print "\n"

我有多少解决这个问题并根据上述逻辑创建列表?

2 个答案:

答案 0 :(得分:2)

您可以使用itemgetter

>>> from operator import itemgetter
>>> map(itemgetter(0), data)
[0.074, 0.02, 0.026, 0.021, 0.077, 0.053, 0.016]
>>> map(itemgetter(1), data)
[0.073, 0.02, 0.026, 0.021, 0.076, 0.052, 0.016]

您还可以使用列表推导(可能更具可读性):

>>> [l[0] for l in data]
[0.074, 0.02, 0.026, 0.021, 0.077, 0.053, 0.016]

答案 1 :(得分:1)

转置列表的一种方法是使用zip

>>> data = [[1,2,3],[4,5,6]]
>>> zip(*data)
[(1, 4), (2, 5), (3, 6)]

要解决数据形状不一致的问题,您可以使用izip_longest

>>> data = [[0.074, 0.073, 0.072, 0.03, 0.029, 0.024, 0.021, 0.02], [0.02, 0.02, 0.015], [0.026, 0.026, 0.02, 0.02, 0.02, 0.015], [0.021, 0.021, 0.02, 0.017], [0.077, 0.076, 0.074, 0.055, 0.045, 0.021], [0.053, 0.052, 0.051, 0.023, 0.022], [0.016, 0.016]]
>>> from itertools import izip_longest
>>> izip_longest(*data)
<itertools.izip_longest object at 0x101d77c00>
>>> list(izip_longest(*data))
[(0.074, 0.02, 0.026, 0.021, 0.077, 0.053, 0.016), (0.073, 0.02, 0.026, 0.021, 0.076, 0.052, 0.016), (0.072, 0.015, 0.02, 0.02, 0.074, 0.051, None), (0.03, None, 0.02, 0.017, 0.055, 0.023, None), (0.029, None, 0.02, None, 0.045, 0.022, None), (0.024, None, 0.015, None, 0.021, None, None), (0.021, None, None, None, None, None, None), (0.02, None, None, None, None, None, None)]

因此:

>>> columns = list(izip_longest(*data))
>>> columns[0]
(0.074, 0.02, 0.026, 0.021, 0.077, 0.053, 0.016)
>>> columns[1]
(0.073, 0.02, 0.026, 0.021, 0.076, 0.052, 0.016)
>>> columns[2]
(0.072, 0.015, 0.02, 0.02, 0.074, 0.051, None)

我不确定你想要为“#3”做什么 - 你的最后一个子列表只有两个元素。 izip_longest有一个fillvalue选项,可用于指定要执行的操作,默认为None(这就是columns[2]中最后一个条目为None的原因)