2011-11-18 48 views
114

我想了解是否有意義將列表的內容添加到另一個列表。Python:獲取列表的內容並將其附加到另一個列表

我有通過循環功能創建的第一個列表,它將從文件中獲取特定行並將它們保存在列表中。

然後第二個列表用於保存這些行,並在另一個文件上開始一個新的循環。

我的想法是一旦完成for循環,將其轉儲到第二個列表中,然後開始一個新的循環,將第一個列表的內容再次轉儲到第二個列表中,但將其附加到第二個列表中,列表將是我的循環中創建的所有較小列表文件的總和。只有在滿足某些條件的情況下,該列表才能被附加。

看起來類似於這樣:

# This is done for each log in my directory, i have a loop running 
for logs in mydir: 

    for line in mylog: 
     #...if the conditions are met 
     list1.append(line) 

    for item in list1: 
     if "string" in item: #if somewhere in the list1 i have a match for a string 
      list2.append(list1) # append every line in list1 to list2 
      del list1 [:] # delete the content of the list1 
      break 
     else: 
      del list1 [:] # delete the list content and start all over 

這樣做是有道理還是我應該去不同的路線?

我需要一些效率高,不會佔用太多週期,因爲日誌列表很長,每個文本文件都很大;所以我認爲名單會符合目的。

回答

220

你可能想

list2.extend(list1) 

,而不是

list2.append(list1) 

這裏的區別:

>>> a = range(5) 
>>> b = range(3) 
>>> c = range(2) 
>>> b.append(a) 
>>> b 
[0, 1, 2, [0, 1, 2, 3, 4]] 
>>> c.extend(a) 
>>> c 
[0, 1, 0, 1, 2, 3, 4] 

由於list.extend()接受任意迭代,你也可以更換

for line in mylog: 
    list1.append(line) 

通過

list1.extend(mylog) 
9

看看itertools.chain一個快速的方法來治療許多小清單作爲一個單一的大名單(或至少作爲一個大的迭代),而複製較小的列表:

>>> import itertools 
>>> p = ['a', 'b', 'c'] 
>>> q = ['d', 'e', 'f'] 
>>> r = ['g', 'h', 'i'] 
>>> for x in itertools.chain(p, q, r): 
     print x.upper() 
+0

聽起來很光滑!我會看看它是否可以替換我已經使用itertools的代碼! – user1006198

3

這似乎是相當合理的,你要做什麼。

它斜靠在Python的

稍短的版本做更繁重的工作可能是:

for logs in mydir: 

    for line in mylog: 
     #...if the conditions are met 
     list1.append(line) 

    if any(True for line in list1 if "string" in line): 
     list2.extend(list1) 
    del list1 

    .... 

(True for line in list1 if "string" in line)迭代list,每當發現匹配發出Trueany()只要找到第一個True元素,就會立即使用短路評估返回Truelist2.extend()list1的內容追加到最後。

+0

感謝您指出優化柯克! – user1006198

+1

'任何(真在列表1線如果線「串」)'更整齊地寫爲'任何(以線爲列表1線「串」)'。 –

+0

好一點,@KarlKnechtel,雖然他們微妙的不同。你的版本總是會發出* something *,無論是True還是False。我的只發射一個True。我不知道這些基準如何,或者是否有足夠的差異。 –

2

使用map()reduce()內置函數

def file_to_list(file): 
    #stuff to parse file to a list 
    return list 

files = [...list of files...] 

L = map(file_to_list, files) 

flat_L = reduce(lambda x,y:x+y, L) 

最小「的循環」和優雅的編碼方式:)

0

回顧一下在以前的答案。如果你有[0,1,2]列表和另一個[3,4,5],你想將它們合併,因此它成爲[0,1,2,3,4,5],您可以使用chainingextending,應該知道它們的區別明智地使用它爲您的需求。

擴展列表

使用listextend方法,你可以從一個列表做元素的副本到另一個。然而,這將導致額外的內存使用情況,如果你想成爲的內存使用效率應該是在大多數情況下罰款,但可能會引起問題。

a = [0,1,2] 
b = [3,4,5] 
a.extend(b) 
>>[0,1,2,3,4,5] 

enter image description here

鏈接列表

相反,你可以使用itertools.chain接線許多列表,它會返回一個所謂的iterator可用於遍歷列表。這是更高的內存效率,因爲它不是複製元素,而是指向下一個列表。

from itertools import chain 
a = [0,1,2] 
b = [3,4,5] 
c = itertools.chain(a, b) 

enter image description here

請返回來自第一迭代直到它耗盡元件的迭代器,然後前進到下一個迭代,直到所有的iterables的耗盡。用於將連續序列作爲單個序列進行處理。

0

如果我們有這樣的文章:

list = [2,2,3,4] 

兩種方式將其複製到另一個列表。

1.

x = [list] # x =[] x.append(list) same 
print("length is {}".format(len(x))) 
for i in x: 
    print(i) 
length is 1 
[2, 2, 3, 4] 

2.

x = [l for l in list] 
print("length is {}".format(len(x))) 
for i in x: 
    print(i) 
length is 4 
2 
2 
3 
4 
相關問題