Python:获取深度项目?(设置库?)

mpe*_*pen 1 python algorithm list set

我有一个这样的嵌套列表:

PLACES = (
    ('CA', 'Canada', (
        ('AB', 'Alberta'),
        ('BC', 'British Columbia' (
            ('van', 'Vancouver'),
        ),
        ...
    )),
    ('US', 'United States', (
        ('AL', 'Alabama'),
        ('AK', 'Alaska'),
        ...
Run Code Online (Sandbox Code Playgroud)

我需要从中检索一些数据.如果depth0我需要检索所有国家(和它们的代码),如果depth == 1,我需要找回所有的州/省,如果depth == 2我需要检索所有的城市......等等.是否有一些设置库来做这样的事情?或者有人能指出我正确的方向?我开始编写一个解决方案只是为了意识到它不适用于深度超过1的级别,因为你必须进出每个列表......

另请注意,并非所有项目都有第3部分(即,我们假装艾伯塔省没有任何城市,因此在深度2处检索项目只会('van','Vancouver')在这种有限的情况下返回).


我以前没有意识到这一点,但我也需要父值.所以,我修改了interjay的解决方案:

def depth_gen(seq, depth, par=None):
    if depth==0:
        for x in seq:
            yield par, x[0], x[1] 
        return

    for x in seq:
        if len(x)==3:
            par = x[0]
            for y in depth_gen(x[2], depth-1, par):
                yield y
Run Code Online (Sandbox Code Playgroud)

我用它来生成一些HTML:

<label for="id-pickup_address-province">Province</label>
<select id="id-pickup_address-province" rel="pickup_address-country" name="pickup_address-province">
    <option rel="CA" value="AB">Alberta</option>
    <option rel="CA" value="BC">British Columbia</option>
    <option rel="CA" value="MB">Manitoba</option>
    ...
    <option rel="US" value="WV">West Virginia</option>
    <option rel="US" value="WI">Wisconsin</option>
    <option rel="US" value="WY">Wyoming</option>
</select>
<label for="id-pickup_address-country">Country</label>
<select id="id-pickup_address-country" name="pickup_address-country">
    <option value="CA">Canada</option>
    <option value="US">United States</option>
</select>
Run Code Online (Sandbox Code Playgroud)

然后我应该能够根据选择的国家/地区使用jQuery轻松过滤列表...

int*_*jay 5

这是一个适用于任何深度的解决方案:

def depthGenerator(seq, depth):
    if depth==0:
        for x in seq:
            yield x[:2] #strip subsequences
        return

    for x in seq:
        if len(x)==3:   #has subsequence?
            for y in depthGenerator(x[2], depth-1):
                yield y
Run Code Online (Sandbox Code Playgroud)

例:

>>> list(depthGenerator(PLACES, 1))
[('AB', 'Alberta'), ('BC', 'British Columbia'), ('AL', 'Alabama'), ('AK', 'Alaska')]
Run Code Online (Sandbox Code Playgroud)