递归地(或非递归地)迭代python数组并获取元素

时间:2013-09-24 02:52:53

标签: python arrays

我有一个python数组数据结构,如[[v],[v]],v是一个大小为2的数组或另一个[[v],[v]]数据类型。你可以看到下面的真实数据:

ex1:

list: [[[1, '1.0.1'], [1, '2.0.1']], [1, '3.0.11']]

ex2:

list: [[[[1, '1.0.1'], [1, '2.0.1']], [1, '3.0.11']], [1, '4.0.11']]

现在我的问题是我应该首先从左到右获取元素[1,'1.0.1']然后是[1,'2.0.1'],依此类推。并注意数组的大小各不相同。

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:2)

一种可能的解决方案是展平列表:

def flatten(lst):
    if not lst:
        return []
    elif not isinstance(lst, list):
        return [lst] 
    else:
        return flatten(lst[0]) + flatten(lst[1:])

这将允许您按顺序遍历列表:

ls1 = [[[[1, '1.0.1'], [1, '2.0.1']], [1, '3.0.11']], [1, '4.0.11']]
flatten(ls1)
=> [1, '1.0.1', 1, '2.0.1', 1, '3.0.11', 1, '4.0.11']

或者,使用发电机:

def flatten(lst):
    if not lst:
        return
    elif not isinstance(lst, list):
        yield lst
    else:
        for e in flatten(lst[0]):
            yield e
        for e in flatten(lst[1:]):
            yield e

list(flatten(ls1))
=> [1, '1.0.1', 1, '2.0.1', 1, '3.0.11', 1, '4.0.11']

答案 1 :(得分:1)

这是一个做你想做的迭代器:

def iterate(xs):
    try:
        if isinstance(xs[1],str):
            yield xs
            return
    except IndexError:
        pass
    for x in xs:
        yield from iterate(x)

使用示例:

>>> list(iterate([[[[1, '1.0.1'], [1, '2.0.1']], [1, '3.0.11']], [1, '4.0.11']]))
[[1, '1.0.1'], [1, '2.0.1'], [1, '3.0.11'], [1, '4.0.11']]

答案 2 :(得分:0)

这个答案可能遗漏了一些明显的东西,所以我提前道歉......

但是你的数据结构似乎比它需要的要复杂得多?

v = [(1, '1.0.1'), (1, '2.0.1'), (1, '3.0.11')]
v.append((1, '4.0.11'))
print v

做你想做的事吗?