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

Python:获取深度项目?(设置库?),python,algorithm,list,set,Python,Algorithm,List,Set,我有一个嵌套列表,如下所示: PLACES = ( ('CA', 'Canada', ( ('AB', 'Alberta'), ('BC', 'British Columbia' ( ('van', 'Vancouver'), ), ... )), ('US', 'United States', ( ('AL', 'Alabama'), ('AK', '

我有一个嵌套列表,如下所示:

PLACES = (
    ('CA', 'Canada', (
        ('AB', 'Alberta'),
        ('BC', 'British Columbia' (
            ('van', 'Vancouver'),
        ),
        ...
    )),
    ('US', 'United States', (
        ('AL', 'Alabama'),
        ('AK', 'Alaska'),
        ...
我需要从中检索一些数据。如果深度为0,我需要检索所有国家及其代码,如果深度=1,我需要检索所有州/省,如果深度=2,我需要检索所有城市。。。等等有没有专门的图书馆可以做这样的事情?或者有人能给我指出正确的方向吗?我开始编写一个解决方案,但却意识到它不适用于比1更深的级别,因为你必须进入和退出每个列表

还要注意的是,并不是所有的物品都有第三部分,也就是说,我们假装阿尔伯塔省没有任何城市,所以在深度2检索物品时,在这个有限的场景中只会返回“van”和“温哥华”

我以前没有意识到这一点,但我也需要父值。因此,我修改了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
我正在使用它生成一些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>
然后我应该能够根据选择的国家使用jQuery轻松筛选列表…

这就是我看到的:

for (county, countryName, stateTuple) in MyTuple:
     for (state, stateName, CountyTuple) in stateTuple:
         ...
以此类推,这是一种重复模式

def extract( myTuple, level ):
    if level:
        return ( item[2] for item in myTuple if len(item) == 3)
    else:
        return ( (item[0], item[1]) for item in myTuple )
然后根据深度需要多次调用extract。

这就是我看到的:

for (county, countryName, stateTuple) in MyTuple:
     for (state, stateName, CountyTuple) in stateTuple:
         ...
以此类推,这是一种重复模式

def extract( myTuple, level ):
    if level:
        return ( item[2] for item in myTuple if len(item) == 3)
    else:
        return ( (item[0], item[1]) for item in myTuple )

然后根据深度需要多次调用extract。

建议不要使用嵌套列表。创建一些真实的类结构,为您提供更多的信息和组织。这将使它更容易思考,更容易编码,也更容易让其他人阅读。

建议不要使用嵌套列表。创建一些真实的类结构,为您提供更多的信息和组织。这将使它更容易思考,更容易编写代码,也更容易让其他人阅读。

这里有一个解决方案,适用于任何深度:

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
例如:

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

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

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
例如:

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

你的问题有点让人困惑。你所说的深度是指你要提取的元组中的元组有多深?@wheaties:是的。。。深度=0是所有国家的第一级,深度=1是所有州的第二级,等等。随你怎么说,但我需要能够根据项目嵌套的深度检索项目。你的问题有点让人困惑。你所说的深度是指你要提取的元组中的元组有多深?@wheaties:是的。。。depth=0是所有国家的第一级,depth=1是所有州的第二级,等等。随你怎么称呼它,但我需要能够根据项目嵌套的深度检索项目。我希望易于创建。这将进入一个框架,我希望人们能够快速写出他们的选择,而不需要任何额外的绒毛。不过谢谢你的建议!我要追求创造的轻松。这将进入一个框架,我希望人们能够快速写出他们的选择,而不需要任何额外的绒毛。不过谢谢你的建议!这看起来比我正在做的更加优雅和实用!这看起来比我正在做的更加优雅和实用!