gpt4 book ai didi

python - 为什么我不能拆分这个 python 列表?

转载 作者:太空宇宙 更新时间:2023-11-04 07:41:28 24 4
gpt4 key购买 nike

我有一些代码来解析 apache 日志文件(start_searchend_search 是在 apache 日志中找到的格式的日期字符串):

with open("/var/log/apache2/access.log",'r') as log:
from itertools import takewhile, dropwhile
s_log = dropwhile(lambda L: start_search not in L, log)
e_log = takewhile(lambda L: end_search not in L, s_log)
query = [line for line in e_log if re.search(r'GET /(.+veggies|.+fruits)',line)]

import csv
query_dict = csv.DictReader(query,fieldnames=('ip','na-1','na-2','time', 'zone', 'url', 'refer', 'client'),quotechar='"',delimiter=" ")

import re
veggies = [ x for x in query_dict if re.search('veggies',x['url']) ]
fruits = [ x for x in query_dict if re.search('fruits',x['url']) ]

第二个列表生成器总是空的;也就是说,如果我调换最后两行的顺序:

    fruits = [ x for x in query_dict if re.search('fruits',x['url']) ]
veggies = [ x for x in query_dict if re.search('veggies',x['url']) ]

第二个列表总是空的。

为什么? (以及如何填充 fruitsveggies 列表?)

最佳答案

你只能循环遍历迭代器一次query_dict 是一个迭代器,一旦扫描过 veggies 就不能再次迭代以搜索 fruits

不要在这里使用列表理解。循环遍历 query_dict 一次,检查每个条目中的 veggiesfruits:

veggies = []
fruits = []

for x in query_dict:
if re.search('veggies',x['url']):
veggies.append(x)
if re.search('fruits',x['url']):
fruits.append(x)

备选方案是:

  • fruits 列表重新创建 csv.DictReader() 对象:

    query_dict = csv.DictReader(query,fieldnames=('ip','na-1','na-2','time', 'zone', 'url', 'refer', 'client'),quotechar='"',delimiter=" ")
    veggies = [ x for x in query_dict if re.search('veggies',x['url']) ]
    query_dict = csv.DictReader(query,fieldnames=('ip','na-1','na-2','time', 'zone', 'url', 'refer', 'client'),quotechar='"',delimiter=" ")
    fruits = [ x for x in query_dict if re.search('fruits',x['url']) ]

    这做了双重工作;您遍历整个数据集两次。

  • 使用 itertools.tee() “克隆”迭代器:

    from itertools import tee
    veggies_query_dict, fruits_query_dict = tee(query_dict)
    veggies = [ x for x in veggies_query_dict if re.search('veggies',x['url']) ]
    fruits = [ x for x in fruits_query_dict if re.search('fruits',x['url']) ]

    这最终会将所有 query_dict 缓存在 tee 缓冲区中,同一任务需要两倍的内存,直到 fruits 清空再次缓冲。

关于python - 为什么我不能拆分这个 python 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19601355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com