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

use*_*198 179 python list

我试图理解是否有必要获取列表的内容并将其附加到另一个列表.

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

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

我的想法是在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
Run Code Online (Sandbox Code Playgroud)

这是否有意义,还是应该选择不同的路线?

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

Sve*_*ach 337

你可能想要

list2.extend(list1)
Run Code Online (Sandbox Code Playgroud)

代替

list2.append(list1)
Run Code Online (Sandbox Code Playgroud)

这是区别:

>>> 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]
Run Code Online (Sandbox Code Playgroud)

既然list.extend()接受任意迭代,你也可以替换

for line in mylog:
    list1.append(line)
Run Code Online (Sandbox Code Playgroud)

通过

list1.extend(mylog)
Run Code Online (Sandbox Code Playgroud)


Ray*_*ger 12

看一下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()
Run Code Online (Sandbox Code Playgroud)


use*_*754 8

回顾以前的答案。如果您有一个列表 with[0,1,2]和另一个列表,并且[3,4,5]您想合并它们,那么它变成了[0,1,2,3,4,5],您可以使用chainingextending并且应该知道差异以明智地使用它来满足您的需求。

扩展列表

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

a = [0,1,2]
b = [3,4,5]
a.extend(b)
>>[0,1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

链接列表

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

import itertools
a = [0,1,2]
b = [3,4,5]
c = itertools.chain(a, b)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

制作一个迭代器,从第一个迭代器返回元素,直到它耗尽,然后继续下一个迭代器,直到所有迭代器都耗尽。用于将连续序列视为单个序列。


Kir*_*ser 5

对于您想要做的事情来说,这似乎相当合理。

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

    ....
Run Code Online (Sandbox Code Playgroud)

每当找到匹配项时就会(True for line in list1 if "string" in line)进行迭代并list发出。使用短路求值,一旦找到第一个元素就返回。将 的内容附加到末尾。Trueany()TrueTruelist2.extend()list1


Aks*_*jan 5

您还可以使用“+”运算符组合两个列表(例如 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]
Run Code Online (Sandbox Code Playgroud)


jac*_*.py 5

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

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

print(list3)
>> [0, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)