2017-01-23 65 views
2

我有一個字符串列表foo和另一個整數列表bar,它在foo中保留重要索引的軌道。基於另一個列表中的索引對列表進行迭代

例如:

foo = [{}.format(i) for i in range(1, 11)] # not necessarily of this format 
bar = [0, 3, 5] 

我想創建配方用於創建列表的列表,基於在bar指數分裂foo獲得每個列表。

預計輸出上面的例子:

[['1', '2', '3'], ['4', '5'], ['6', '7', '8', '9', '10']] 

爲了實現這一點,我已經創建了下面的函數工作正常:

result = [] 
for index, value in enumerate(b): 
    if index == len(b) - 1: 
     result.append(a[value:]) 
    elif index == 0 and value != 0: 
     result.append(a[0: value]) 
    else: 
     result.append(a[value: b[index + 1]]) 

然而,我發現這個代碼高度非Python化,感謝我的C-Java背景。
我想知道更好的解決方案,這個問題(也許我們可以用itertools莫名其妙)。

+0

典型的切割問題。也許這有助於:http://stackoverflow.com/questions/509211/explain-pythons-slice-notation –

+0

@JanZeiseweis謝謝你的參考,但它沒有太大的用途,這個特定的問題。 –

+0

@schwobaseggl感謝您的注意。我將其標記爲重複 –

回答

1

下面是一個使用列表理解的一種方法:

In [107]: bar = bar + [len(foo)] if bar[-1] < len(foo) else bar 


In [110]: [foo[i:j] for i, j in zip(bar, bar[1:])] 
Out[110]: [['1', '2', '3'], ['4', '5'], ['6', '7', '8', '9', '10']] 
2

你可以做如下:

In [3]: [foo[a:b] for a, b in zip(bar, bar[1:]+[None])] 
Out[3]: [['1', '2', '3'], ['4', '5'], ['6', '7', '8', '9', '10']] 
+0

如果'bar'包含一個等於'foo'長度的索引,則會生成一個空列表!嘗試'bar = [0,3,5,10]' – Kasramvd

+0

'foo'的長度索引也會在'foo'列表之外? –

相關問題