Python:获取列表的内容并将其附加到另一个列表
我试图了解是否有意义采取列表的内容,并将其附加到另一个列表。
我有通过循环function创build的第一个列表,这将获得一个文件中的特定行,并将其保存在一个列表中。
然后第二个列表被用来保存这些行,并开始一个新的周期在另一个文件。
我的想法是一旦获得循环完成的列表,将其转储到第二个列表中,然后开始一个新的循环,将第一个列表的内容再次转储到第二个列表中,但将其附加到第二个列表中,所以第二个列表将是在我的循环中创build的所有较小的列表文件的总和。 只有在某些条件满足的情况下,该列表才能被附加。
它看起来像这样的东西:
# 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()
接受任意的迭代,你也可以replace
for line in mylog: list1.append(line)
通过
list1.extend(mylog)
看一看itertools.chain中的一个快速的方法,将多个小列表作为一个单一的大列表(或者至less作为一个大的迭代器),而不需要复制较小的列表:
>>> 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
。 只要find第一个True
元素, any()
使用短路评估返回True
。 list2.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)
最小“循环”和优雅的编码模式:)