【问题标题】:Python: Get items at depth? (set library?)Python:深入获取项目? (设置库?)
【发布时间】:2010-04-09 20:10:33
【问题描述】:

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

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

我需要从中检索一些数据。如果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

我用来生成一些 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 过滤列表...

【问题讨论】:

  • 你的问题有点混乱。你所说的“深度”是什么意思是你要提取的元组的元组有多深?
  • @wheaties:是的... depth=0 是第一级(所有国家),depth=1 是第二级(所有州),等等。随便你怎么称呼它,但是我需要能够根据嵌套的深度检索这些项目。

标签: python algorithm list set


【解决方案1】:

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

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')]

【讨论】:

  • 这看起来比我正在做的更优雅和实用!
【解决方案2】:

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

【讨论】:

  • 我打算轻松创建。这将进入一个框架,我希望人们能够快速写出他们的选择,而无需任何额外的绒毛。
  • (感谢您的建议!)
【解决方案3】:

这是我看到的:

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多