获取一个列表的内容并将其附加到另一个列表

我试图理解它是否有意义,采取一个列表的内容,并将其附加到另一个列表。

我通过一个循环函数创建了第一个列表,它将从文件中获取特定的行,并将它们保存在一个列表中。

然后使用第二个列表保存这些行,并在另一个文件上开始一个新的循环。

我的想法是在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

这有意义吗,还是我应该走另一条路?

我需要一些有效的,不会占用太多的周期,因为日志的列表很长,每个文本文件是相当大的;所以我认为这些清单可以满足这个目的。

304810 次浏览

你可能想要

list2.extend(list1)

而不是

list2.append(list1)

区别在于:

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = [7, 8, 9]
>>> b.append(a)
>>> b
[4, 5, 6, [1, 2, 3]]
>>> c.extend(a)
>>> c
[7, 8, 9, 1, 2, 3]

由于list.extend()接受任意可迭代对象,所以也可以替换

for line in mylog:
list1.append(line)

通过

list1.extend(mylog)

看一下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()

这对你要做的事情来说似乎很合理。

一个略短的版本,它依赖于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并在找到匹配时发出True。一旦找到第一个True元素,any()使用短路求值返回Truelist2.extend()list1的内容追加到末尾。

使用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)

最小的“for循环”和优雅的编码模式:)

回顾一下前面的答案。如果你有一个带有[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,可用于遍历列表。这是更有效的内存,因为它不是复制元素,而只是指向下一个列表。

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

enter image description here

创建一个迭代器,从第一个可迭代对象返回元素,直到耗尽它,然后继续到下一个可迭代对象,直到耗尽所有可迭代对象。用于将连续序列作为单个序列处理。

如果我们有如下列表:

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
你也可以使用'+'运算符组合两个列表(比如a,b)。 例如,< / p >
a = [1,2,3,4]
b = [4,5,6,7]
c = a + b


Output:
>>> c
[1, 2, 3, 4, 4, 5, 6, 7]

你可以简单地连接两个列表,例如:

list1 = [0, 1]
list2 = [2, 3]
list3 = list1 + list2


print(list3)
>> [0, 1, 2, 3]

你可以使用__add__ Magic方法:

a = [1,2,3]
b = [4,5,6]
c = a.__add__(b)
Output:
>>> c
[1,2,3,4,5,6]