1

我有一个类似 [[v], [v]] 的 python 数组数据结构,其中 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'] 等等。并注意数组的大小会有所不同。

我怎样才能做到这一点?

4

3 回答 3

3

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

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']
于 2013-09-24T03:01:56.340 回答
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']]
于 2013-09-24T03:06:47.510 回答
0

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

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

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

做你想做的事?

于 2013-09-24T02:58:34.690 回答