【发布时间】:2010-04-09 20:10:33
【问题描述】:
我有一个类似这样的嵌套列表:
PLACES = (
('CA', 'Canada', (
('AB', 'Alberta'),
('BC', 'British Columbia' (
('van', 'Vancouver'),
),
...
)),
('US', 'United States', (
('AL', 'Alabama'),
('AK', 'Alaska'),
...
我需要从中检索一些数据。如果depth 是0 我需要检索所有国家(及其代码),如果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 是第二级(所有州),等等。随便你怎么称呼它,但是我需要能够根据嵌套的深度检索这些项目。