2017-03-08 66 views
1

我想從列表中讀取特定數量的行並將所有這些值分配給新列表。然後,我想從前面的last_value + 1行讀取下一組,並將其分配給一個新的列表。到目前爲止,我有這樣的:如何生成許多列表併爲其分配值

比方說,u = [1,2,3....,9,10,11,12,13...,19,20],我想從u第10個值分配到我的新生成的list1 = [] => list1 = [1,2,..9,10]

那麼我想從u接下來的10個值被分配到list2這樣list2 = [11,12,13..,20]。到目前爲止的代碼是:

nLines = 10 
nrepeats = 2 
j=0 
i=0 

while (j<nrepeats): 
### Generating empty lists ### 
mklist = "list" + str(j) + " = []" 
### do the segmentation ### 
for i, uline in enumerate(u): 
    if i >= i and i < i+nLines: 
     mklist.append(uline) 
j=j+1 

現在的問題是,我不能追加到mklist因爲它是一個字符串:

AttributeError: 'str' object has no attribute 'append' 

我如何可以分配環內的那些價值?

+1

你真的希望一切都成爲一個字符串?你不想最終列出清單嗎? – Denziloe

+0

如果我> =我和我<我+ nLines:'這些'我是否應該是'j's?就這樣,這種情況總是如此。 –

+0

@PatrickHaugh我的意思是:'如果我> = 0,我<10'讀這些行並追加它們。不過,我還沒有弄清楚它是如何在循環的下一步看到的,它應該讀取11到20的值。 – Shaun

回答

1

可以使用zip函數從iterables族元素成相同大小的組。實際上,有兩種方式,在如何的方式來處理情況下,你不能分割源數據不同乾淨

u = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21] 

第一種方式是定期zip並丟棄剩下的片段

>>>list(zip(*[iter(u)]*10)) 
[(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), (11, 12, 13, 14, 15, 16, 17, 18, 19, 20)] 

第二種方式使用itertools.zip_longest和墊出了最後一組與一些fillvalue(默認None

>>>import itertools 
>>>list(itertools.zip_longest(*[iter(u)]*10, fillvalue=None)) 
[(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), (11, 12, 13, 14, 15, 16, 17, 18, 19, 20), (21, None, None, None, None, None, None, None, None, None)] 
+0

真棒!我如何再次訪問前十個值?假設我有上面定義的u和x相似但不同的數字。現在,我想繪製前10位數字與前10位數字x – Shaun

+0

。您可以像訪問其他列表一樣訪問它們。前10個值將位於結果列表的零索引處。 –

+0

我如何訪問第一個列表中的第一個條目?所以如果是((1,2,3),(4,5,6),....))如何從第一個列表打印1? – Shaun

2

你可以使用一個更合適的收集,例如,一個詞典:

nLines = 10 
nrepeats = 2 
j=0 
i=0 

my_dict = {} 

while (j<nrepeats): 
    ### Generating empty lists ### 
    my_dict[str(j)] = [] 
    ### do the segmentation ### 
    for i, uline in enumerate(u): 
     if i >= i and i < i+nLines: 
      my_dict[str(j)].append(uline) 
j=j+1 
+0

這是一個好主意。我如何訪問它們?前10個值只是my_dict [0]? – Shaun

+0

@Shaun是的,沒錯,但您需要將訪問者轉換爲字符串:例如my_dict [str(0)]將返回第一個數組。 –

+0

偉大的答案謝謝!你的方式,以及帕特里克霍的:) – Shaun