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


191

我试图了解获取列表内容并将其附加到另一个列表是否有意义。

我具有通过循环功能创建的第一个列表,该列表将从文件中获取特定行并将其保存在列表中。

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

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

这有意义还是我应该选择其他路线?

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

Answers:


369

你可能想要

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)

是的,append是一个元素,extend就像concat。
卡塔琳娜·奇尔库

13

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

听起来真的很滑!我将看一下它是否可以替换使用itertools已经拥有的代码!
user1006198 2011年

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并发出True每当发现匹配。一旦找到第一个元素,就会any()使用短路评估来返回。将的内容附加到末尾。TrueTruelist2.extend()list1


1
any(True for line in list1 if "string" in line)更整洁地写成any("string" in line for line in list1)
Karl Knechtel

好点,@ KarlKnechtel,尽管它们有些微不同。您的版本始终会发出某种结果,即True或False。我的只会发出一个True。我不知道这些基准测试是如何进行的,或者是否有足够的区别来解决。
Kirk Strauser 2011年

在两种情况下,都要any接收一个发电机;没有在任何地方构造True或False值的列表。我的版本返回了更多any要检查的东西,但作为回报,没有在生成器本身中执行相同的检查。我想这是洗脸,但timeit在这里是权威,不是我。:)
Karl Knechtel


3

回顾以前的答案。如果您有一个清单,[0,1,2]而另一个清单是,[3,4,5]并且您想将它们合并,则它变成[0,1,2,3,4,5],您可以使用chainingextending并且应该知道区别,以便根据需要明智地使用它。

扩展清单

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

在此处输入图片说明

创建一个迭代器,该迭代器从第一个可迭代对象返回元素,直到耗尽为止,然后继续进行下一个可迭代对象,直到所有可迭代对象都耗尽为止。用于将连续序列视为单个序列。


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

如果我们有如下列表:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.