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

时间:2011-11-18 02:31:23

标签: 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

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

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

7 个答案:

答案 0 :(得分:308)

你可能想要

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)

答案 1 :(得分:11)

查看 itertools.chain ,以便快速将许多小型列表视为单个大型列表(或至少作为单个大型可列表),而无需复制较小的列表: / p>

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

答案 2 :(得分: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的内容附加到最后。

答案 3 :(得分: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)

最小"用于循环"优雅的编码模式:)

答案 4 :(得分:2)

回顾以前的答案。如果您有一个包含FILE* myFile = fopen("abc.bin", "rb"); /* Code to load contents of file and do some operations */ remove("abc.bin") fclose(myFile); 的列表和另一个包含[0,1,2]的列表,并且您想合并它们,那么它会变为[3,4,5],您可以使用[0,1,2,3,4,5]或{{1}并且应该知道差异以明智地满足您的需求。

扩展列表

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

list

enter image description here

链接列表

相反,您可以使用extend连接多个列表,这将返回一个可用于迭代列表的所谓a = [0,1,2] b = [3,4,5] a.extend(b) >>[0,1,2,3,4,5] 。这样可以提高内存效率,因为它不会复制元素,而只是指向下一个列表。

itertools.chain

enter image description here

  

创建一个迭代器,它返回第一个iterable中的元素,直到它耗尽,然后进入下一个iterable,直到所有的iterables都用完为止。用于将连续序列作为单个序列处理。

答案 5 :(得分: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

答案 6 :(得分:0)

您还可以使用'+'运算符组合两个列表(例如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]