2014-11-22 53 views
0

我需要一些列表,bot列表的數量和列表的長度,我不知道priory。列表的類型是str。我怎樣才能以有效的方式做到這一點?列表的動態大小列表

我想:

data = [[]] * number_of_needed_lists 
for line in f.readlines(): 
    columns = line.split(',') 
     for i, dta in enumerate(data): 
      data[i] = dta + [columns[i]] 

但這是非常緩慢的。我嘗試了一個類似的結構,但有一個列表字典,類似的結果。

此外,我發現以下奇怪現象:

a = [[]] * 5 
a[0] += [1] 
a 
==> [[1], [1], [1], [1], [1]] 
expected: [[1],[],[],[],[]] 
+0

你爲什麼不使用'csv'? – 2014-11-22 05:58:19

+0

@ IgnacioVazquez-Abrams我忘了,前段時間我改變了這個,因爲CSV沒有做我所需要的。我可以再試一次,它會解決這個問題嗎?仍然,好奇如何使它以這種方式工作。 – Bastiaan 2014-11-22 06:02:23

回答

1

替換:

data = [[]] * number_of_needed_lists 

有:

data = [[] for i in range(number_of_needed_lists)] 

,當你使用*操作,你實際上是使用相同對象的副本(參考) - 這就是爲什麼,當你改變其中之一 - 所有這些都改變了。

+0

天才!現在速度快了30倍,可以接受。我希望我對這個參考業務有透徹的瞭解。我明白什麼是參考,但要了解幕後發生的情況,... – Bastiaan 2014-11-22 06:10:18

0

首先,你不需要知道列表的長度,如果你想添加一些東西到列表中,你可以簡單地使用list.append()
其次,你可以使用包含了一組列表,所以創建listoflists列表:

listoflists = [] 
for i in range(1, number_of_needed_lists): 
    listoflists.append((range(i), 0)) 
+0

是不是list.apend()與list + = []相同? – Bastiaan 2014-11-22 15:50:15