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

Python 获取列表的内容并将其附加到另一个列表,python,list,Python,List,我试图理解将一个列表的内容附加到另一个列表中是否有意义 我通过循环函数创建了第一个列表,它将从文件中获取特定的行,并将它们保存在列表中 然后使用第二个列表保存这些行,并在另一个文件上开始新的循环 我的想法是在for循环完成后获取列表,将其转储到第二个列表中,然后开始一个新的循环,将第一个列表的内容再次转储到第二个列表中,然后追加它,这样第二个列表将是在我的循环中创建的所有较小列表文件的总和。只有在满足某些条件的情况下,才必须添加该列表 它看起来与此类似: # This is done for e

我试图理解将一个列表的内容附加到另一个列表中是否有意义

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

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

我的想法是在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
这有意义吗?还是我应该选择另一条路线

我需要一些高效的东西,不会占用太多的周期,因为日志列表很长,每个文本文件都相当大;所以我认为这些列表会符合目的。

你可能想要

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()
接受任意iterable,因此也可以替换

for line in mylog:
    list1.append(line)

你可能想要

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()
接受任意iterable,因此也可以替换

for line in mylog:
    list1.append(line)

查看一种快速方法,将许多小列表视为单个大列表(或至少是单个大列表),而无需复制较小的列表:

>>> 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()
查看一种快速方法,将许多小列表视为单个大列表(或至少是单个大列表),而无需复制较小的列表:

>>> 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

    ....

(如果行中有“string”,则列表1中的行为True)
迭代
列表
,并在找到匹配项时发出
True
any()
使用短路求值在找到第一个
True
元素后立即返回
True
list2.extend()
list1
的内容追加到末尾。

这对于您尝试执行的操作似乎相当合理

一个稍微短一点的版本,依靠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

    ....
(如果行中有“string”,则列表1中的行为True)
迭代
列表
,并在找到匹配项时发出
True
any()
使用短路求值在找到第一个
True
元素后立即返回
True
list2.extend()
使用
map()
reduce()内置函数将
list1
的内容追加到末尾。

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)
最小的“用于循环”和优雅的编码模式:)

使用
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,1,2]
的列表和另一个带有
[3,4,5]
的列表,并且您希望将它们合并,那么它将成为
[0,1,2,3,4,5]
,您可以使用
链接
扩展
,并且应该知道其中的区别,以便明智地根据您的需要使用它

扩展列表 使用
list
classes
extend
方法,可以将元素从一个列表复制到另一个列表。然而,这将导致额外的内存使用,在大多数情况下这应该是正常的,但是如果您想提高内存效率,可能会导致问题

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

链接列表 相反,您可以使用
itertools.chain
连接许多列表,这将返回一个所谓的
iterator
,可用于迭代列表。这是更高效的内存,因为它不是复制元素,而是指向下一个列表

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

生成一个迭代器,从第一个iterable返回元素,直到元素用尽,然后继续到下一个iterable,直到所有iterable用尽。用于将连续序列作为单个序列处理


回顾前面的答案。如果您有一个带有
[0,1,2]
的列表和另一个带有
[3,4,5]
的列表,并且您希望将它们合并,那么它将成为
[0,1,2,3,4,5]
,您可以使用
链接
扩展
,并且应该知道其中的区别,以便明智地根据您的需要使用它

扩展列表 使用
list
classes
extend
方法,可以将元素从一个列表复制到另一个列表。然而,这将导致额外的内存使用,在大多数情况下这应该是正常的,但是如果您想提高内存效率,可能会导致问题

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

链接列表 相反,您可以使用
itertools.chain
连接许多列表,这将返回一个所谓的
iterator
,可用于迭代列表。这是更高效的内存,因为它不是复制元素,而是指向下一个列表

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

生成一个迭代器,从第一个iterable返回元素,直到元素用尽,然后继续到下一个iterable,直到所有iterable用尽。用于将连续序列作为单个序列处理


如果我们有如下列表:

list  = [2,2,3,4]
有两种方法可以将其复制到另一个列表中

一,

二,


如果我们有如下列表:

list  = [2,2,3,4]
有两种方法可以将其复制到另一个列表中

一,

二,


还可以使用“+”运算符组合两个列表(例如a、b)。 比如说,

a = [1,2,3,4]
b = [4,5,6,7]
c = a + b

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

还可以使用“+”运算符组合两个列表(例如a、b)。 比如说,

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]

您可以简单地关联两个列表,例如:

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

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

听起来真是太圆滑了!我会看看它,看看是否可以替换我已经使用itertools的代码!听起来真的很差劲