Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化逻辑以从列表中筛选/提取数据的pythonic方法_Python_Filtering - Fatal编程技术网

优化逻辑以从列表中筛选/提取数据的pythonic方法

优化逻辑以从列表中筛选/提取数据的pythonic方法,python,filtering,Python,Filtering,我的清单如下: ['1 (UID 3234 FLAGS (seen \\Seen))', '2 (UID 3235 FLAGS (\\Seen))', '3 (UID 3236 FLAGS (\\Deleted))', '4 (UID 3237 FLAGS (-FLAGS \\Seen +FLAGS))', '5 (UID 3241 FLAGS (-FLAGS \\Seen +FLAGS))', '6 (UID 3242 FLAGS (\\Seen))', '7 (UID 3243 FL

我的清单如下:

['1 (UID 3234 FLAGS (seen \\Seen))', '2 (UID 3235 FLAGS (\\Seen))',
 '3 (UID 3236 FLAGS (\\Deleted))', '4 (UID 3237 FLAGS (-FLAGS \\Seen +FLAGS))',
 '5 (UID 3241 FLAGS (-FLAGS \\Seen +FLAGS))', '6 (UID 3242 FLAGS (\\Seen))', 
 '7 (UID 3243 FLAGS (\\Seen))', '8 (UID 3244 FLAGS (\\Seen))', 
 '9 (UID 3245 FLAGS (\\Seen))', '10 (UID 3247 FLAGS (\\Seen))', 
'11 (UID 3252 FLAGS (\\Seen))', '12 (UID 3253 FLAGS (\\Deleted))', 
'13 (UID 3254 FLAGS ())', '14 (UID 3256 FLAGS (\\Seen))', '15 (UID 3304 FLAGS ())', 
'16 (UID 3318 FLAGS (\\Seen))', '17 (UID 3430 FLAGS (\\Seen))', 
'18 (UID 3431 FLAGS ())', '19 (UID 3434 FLAGS (\\Seen))', 
'20 (UID 3447 FLAGS (-FLAGS \\Seen +FLAGS))', '21 (UID 3478 FLAGS ())', 
'22 (UID 3479 FLAGS ())', '23 (UID 3480 FLAGS ())', '24 (UID 3481 FLAGS ())']
从这个列表中,我想要三个不同的列表作为结果。我希望使用列表上的单个迭代得到结果

  • 所有UID的列表,即[32343235323632373241….]

  • 查看的UID列表,即[32343235…]最好的方法是将数据转换为将UID映射到标志的dict,然后进行搜索。因此,数据将如下所示:

    {'3254': '', '3304': '', '3236': '\\Deleted', '3237': '-FLAGS \\Seen +FLAGS', '3234': 'seen \\Seen', '3235': '\\Seen', '3430': '\\Seen', '3431': '', '3252': '\\Seen', '3253':'\\Deleted', '3478': '', '3479': '', '3256': '\\Seen', '3481': '', '3480': '', '3318': '\\Seen', '3434': '\\Seen', '3243': '\\Seen', '3242': '\\Seen', '3241': '-FLAGS \\Seen +FLAGS', '3247': '\\Seen', '3245': '\\Seen', '3244': '\\Seen', '3447': '-FLAGS \\Seen +FLAGS'}
    
    items = ['1 (UID 3234 FLAGS (seen \\Seen))', '2 (UID 3235 FLAGS (\\Seen))', '3 (UID 3236 FLAGS (\\Deleted))', '4 (UID 3237 FLAGS (-FLAGS \\Seen +FLAGS))', '5 (UID 3241 FLAGS (-FLAGS \\Seen +FLAGS))', '6 (UID 3242 FLAGS (\\Seen))',  '7 (UID 3243 FLAGS (\\Seen))', '8 (UID 3244 FLAGS (\\Seen))',  '9 (UID 3245 FLAGS (\\Seen))', '10 (UID 3247 FLAGS (\\Seen))', '11 (UID 3252 FLAGS (\\Seen))', '12 (UID 3253 FLAGS (\\Deleted))', '13 (UID 3254 FLAGS ())', '14 (UID 3256 FLAGS (\\Seen))', '15 (UID 3304 FLAGS ())', '16 (UID 3318 FLAGS (\\Seen))', '17 (UID 3430 FLAGS (\\Seen))', '18 (UID 3431 FLAGS ())', '19 (UID 3434 FLAGS (\\Seen))', '20 (UID 3447 FLAGS (-FLAGS \\Seen +FLAGS))', '21 (UID 3478 FLAGS ())', '22 (UID 3479 FLAGS ())', '23 (UID 3480 FLAGS ())', '24 (UID 3481 FLAGS ())']
    
    import re
    pattern = re.compile(r"\d+ \(UID (\d+) FLAGS \(([^)]*)\)\)")
    values = dict(pattern.match(item).groups() for item in items)
    
    您可以这样做以匹配列表中的每个条目。如果我们让regexp在匹配中返回两个组,我们可以轻松地构建
    dict

    因此,我们最终得出如下结论:

    {'3254': '', '3304': '', '3236': '\\Deleted', '3237': '-FLAGS \\Seen +FLAGS', '3234': 'seen \\Seen', '3235': '\\Seen', '3430': '\\Seen', '3431': '', '3252': '\\Seen', '3253':'\\Deleted', '3478': '', '3479': '', '3256': '\\Seen', '3481': '', '3480': '', '3318': '\\Seen', '3434': '\\Seen', '3243': '\\Seen', '3242': '\\Seen', '3241': '-FLAGS \\Seen +FLAGS', '3247': '\\Seen', '3245': '\\Seen', '3244': '\\Seen', '3447': '-FLAGS \\Seen +FLAGS'}
    
    items = ['1 (UID 3234 FLAGS (seen \\Seen))', '2 (UID 3235 FLAGS (\\Seen))', '3 (UID 3236 FLAGS (\\Deleted))', '4 (UID 3237 FLAGS (-FLAGS \\Seen +FLAGS))', '5 (UID 3241 FLAGS (-FLAGS \\Seen +FLAGS))', '6 (UID 3242 FLAGS (\\Seen))',  '7 (UID 3243 FLAGS (\\Seen))', '8 (UID 3244 FLAGS (\\Seen))',  '9 (UID 3245 FLAGS (\\Seen))', '10 (UID 3247 FLAGS (\\Seen))', '11 (UID 3252 FLAGS (\\Seen))', '12 (UID 3253 FLAGS (\\Deleted))', '13 (UID 3254 FLAGS ())', '14 (UID 3256 FLAGS (\\Seen))', '15 (UID 3304 FLAGS ())', '16 (UID 3318 FLAGS (\\Seen))', '17 (UID 3430 FLAGS (\\Seen))', '18 (UID 3431 FLAGS ())', '19 (UID 3434 FLAGS (\\Seen))', '20 (UID 3447 FLAGS (-FLAGS \\Seen +FLAGS))', '21 (UID 3478 FLAGS ())', '22 (UID 3479 FLAGS ())', '23 (UID 3480 FLAGS ())', '24 (UID 3481 FLAGS ())']
    
    import re
    pattern = re.compile(r"\d+ \(UID (\d+) FLAGS \(([^)]*)\)\)")
    values = dict(pattern.match(item).groups() for item in items)
    
    然后,我们可以轻松查询
    值中的项目
    ,以获得您想要的:

    print "All UIDs:",values.keys()
    print "Seen UIDs:",[uid for uid,flags in values.iteritems() if r"\Seen" in flags]
    print "Deleted UIDs:",[uid for uid,flags in values.iteritems() if r"\Deleted" in flags]
    

    我不确定列表的理解,因为它们通常将一个列表映射到另一个列表(使用过滤或映射)。我没见过他们被用来分割名单。然而,您可以在一次迭代中结合使用genexp和循环来实现这一点。我把它放大了一点,这样就清楚了

    import re
    grepper = re.compile(r'[0-9]+ \(UID (?P<uid>[0-9]+) FLAGS (?P<flags>\(.*\))\)')
    
    t = [..] #your list
    
    items = (grepper.search(m).groupdict() for m in t)
    
    all = []
    seen = []
    deleted = []
    for i in items:
      if "Seen" in i:
        seen.append(i["uid"])
      if "Deleted" in i:
        deleted.append(i["uid"])
      all.append(i["uid"])
    
    重新导入
    grepper=re.compile(r'[0-9]+\(UID(?P[0-9]+)标志(?P\(.*)\)\)
    t=[…]#你的名单
    items=(t中的m的grepper.search(m.groupdict())
    全部=[]
    SEED=[]
    已删除=[]
    对于项目中的i:
    如果在i中“看到”:
    seen.append(i[“uid”])
    如果在i中“删除”:
    已删除。追加(i[“uid”])
    all.append(i[“uid”])
    
    你现在应该有你的3个列表了

    all,deleted,seen = [list(filter(None, a)) for a in \
        zip(*map(lambda a: (a[2], '\Deleted' in a[-1] and a[2], '\Seen' in  a[-1] and a[2]), map(lambda a: a.split(' '), items)))]
    

    使用re和不使用re哪一个会更快-你需要使用timeit进行检查

    我能想到的在一次迭代中生成您要求的三个列表的唯一方法是手动迭代。我想不出什么巨蟒魔法

    all=[]
    seen=[]
    deleted=[]
    for item in alist:
        s=item.split(" ",4)
        all.append(s[2])
        if "seen" in s[-1].lower():
            seen.append(s[2])
        elif "delete" in s[-1].lower():
            deleted.append(s[2])
    
    如果您了解有关格式及其生成方式的详细信息,就可以很容易地对此进行改进。例如,我不知道为什么某些项目中有+标志和-标志,也不知道何时需要括号,所以我不得不使用find()。另外,我可以将字符串一分为二,但我也不知道标志格式是什么意思

    def parseList(l):
        lall = []
        lseen = []
        ldeleted = []
    
        for item in l:
            spl = item.split()
    
            uid = int(spl[2])
    
            lall.append(uid)
    
            for word in spl[4:]:
                if word.find("\Seen") != -1:
                    lseen.append(uid)
    
                elif word.find("\Deleted") != -1:
                    ldeleted.append(uid)
    
        return lall, lseen, ldeleted
    
    重新导入
    数据=['1(UID 3234标志(见\\见))','2(UID 3235标志(\\见))',
    “3(UID 3236标志(\\Deleted)),“4(UID 3237标志(-FLAGS\\seed+FLAGS))”,
    “5(UID 3241标志(-FLAGS\\seed+FLAGS)),“6(UID 3242标志(\\seed))”,
    “7(UID 3243标志(\\Seen))”,“8(UID 3244标志(\\Seen))”,
    “9(UID 3245标志(\\Seen))”,“10(UID 3247标志(\\Seen))”,
    “11(UID 3252标志(\\Seen)),“12(UID 3253标志(\\Deleted))”,
    “13(UID 3254标志())”、“14(UID 3256标志(\\Seen))、“15(UID 3304标志())”,
    “16(UID 3318标志(\\Seen))”,“17(UID 3430标志(\\Seen))”,
    “18(UID 3431标志())”、“19(UID 3434标志(\\Seen))”,
    “20(UID 3447标志(-FLAGS\\Seen+FLAGS)),“21(UID 3478标志())”,
    “22(UID 3479标志())”、“23(UID 3480标志())”、“24(UID 3481标志())”]
    r=重新编译('\d+\s\(UID\s(?P\d+)\sFLAGS\s\(?P.*)\)\)
    uid_列表=[]
    已查看\u uid\u列表=[]
    已删除\u uid\u列表=[]
    对于数据中的s:
    m=r.匹配(s)
    如果m:
    uid\u list.append(m.group('uid'))
    如果m.group('data').rfind('seed')>0:seed\u uid\u list.append(m.group('uid'))
    如果m.group('data').rfind('Deleted')>0:Deleted\u uid\u list.append(m.group('uid'))
    打印uid\U列表
    打印所见uid列表
    打印已删除的uid列表
    
    这一项适用于您的数据样本

    uids, seen, deleted = [], [], []
    for item in myList:
        uids.append(int(item[7:12]))
        if 'Se' in item[20:]:  seen.append(uids[-1])
        elif 'De' in item[20:]: deleted.append(uids[-1])
    

    你不是在反复查看列表中的项目,以便在你的解决方案中被看到和删除吗?@Noufal Ibrahim-是的。我假设列表不会太长,所以我看重可读性而不是性能。我完全同意你的方法。提问者要求进行一次迭代。“这就是我提出这个问题的原因。”努法尔·易卜拉欣——说得好!我没有正确阅读该问题。您正在重复列表两次:(从技术上讲,是grepper.search,然后是items中的i。
    grepper.search
    是一个生成器表达式,它不会预先迭代
    t
    。当然,如果您指的是扫描元素以匹配正则表达式,那么这是一个迭代。“+FLAGS”和“-FLAGS”的意义是什么?“FLAGS”是什么(seen\\seen)“意思是(在条目#1上)?到目前为止你有什么?你列了那个列表吗?如果是的话,你从一开始就错了。@Robert,我想这个列表是由某个IMAP服务器返回的,其中包括像Read/Unread/Deleted这样的标志…哦,天哪。我不确定我想在生产代码中看到它。:)