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是所有州的第二级,等等。随你怎么称呼它,但我需要能够根据项目嵌套的深度检索项目。我希望易于创建。这将进入一个框架,我希望人们能够快速写出他们的选择,而不需要任何额外的绒毛。不过谢谢你的建议!我要追求创造的轻松。这将进入一个框架,我希望人们能够快速写出他们的选择,而不需要任何额外的绒毛。不过谢谢你的建议!这看起来比我正在做的更加优雅和实用!这看起来比我正在做的更加优雅和实用!