2010-04-09 73 views
1

我有一个嵌套的列表是这样的:Python:获取深度项目? (?设置库)

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

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

另请注意,并非所有项目都有第三部分(即,我们假装艾伯塔省没有任何城市,所以在这个有限的场景中,在深度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列表中选择...

+0

你的问题是有点混乱。 “深度”是什么意思是指你想要提取的元组元组的元组有多深? – wheaties 2010-04-09 20:12:27

+0

@wheaties:是的......深度= 0是第一级(所有国家),深度= 1是第二级(所有州)等等。调用它你想要的,但我需要能够检索这些项目基于它们嵌套的深度。 – mpen 2010-04-09 20:14:23

回答

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 

例子:

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

这看起来更加优雅和功能比我工作! – mpen 2010-04-09 20:35:26

1

这是我所看到的:

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) 

然后根据您的“深度”需要调用提取多次。

1

建议,不要使用嵌套列表。创建一些真正的类结构,给你更多的信息和组织。它会让思考更容易,更易于编写代码,并且更容易让其他人阅读。

+0

我打算轻松创作。这是一个框架,我希望人们能够快速写出他们的选择,而不会有任何额外的麻烦。 – mpen 2010-04-09 20:33:34

+0

(感谢您的建议!) – mpen 2010-04-09 21:07:55