python中如何将两个列表组合成字典,并存放于一个新字典中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中如何将两个列表组合成字典,并存放于一个新字典中相关的知识,希望对你有一定的参考价值。

data_list = ['MC', 'YC', 'ME', 'YE']
num_list = ['1000','2000','3000','4000']
我想要的效果是:['MC':1000, 'YC':2000, 'ME':3000, 'YE':4000]

参考技术A data_list = ['MC', 'YC', 'ME', 'YE']
num_list = [1000,2000,3000,4000]

c = dict(map(lambda x,y:[x,y], data_list,num_list))
print(c)

Python:如何最好地将两个正则表达式组合成一个模式匹配?

【中文标题】Python:如何最好地将两个正则表达式组合成一个模式匹配?【英文标题】:Python: how best to combine two regex's into one pattern match? 【发布时间】:2015-08-18 09:43:45 【问题描述】:

给定一个类型为 Receive 的电子邮件标题字段列表,例如:

Received: by 10.194.174.73 with SMTP id bq9csp183244wjc;
        Mon, 5 May 2014 17:49:10 -0700 (PDT)
X-Received: by 10.180.14.233 with SMTP id s9mr18354760wic.53.1399337350112;
        Mon, 05 May 2014 17:49:10 -0700 (PDT)
Received: from mail-wg0-f52.google.com
Received: by mail-ie0-x247.google.com with SMTP id gx4so163592215ieb.1
        for <myemailaddress@gmail.com>; Mon, 01 Jun 2015 18:34:50 -0700 (PDT)

每个字段通过 IP 地址或域名报告“跃点”。我正在寻找一个能够兼顾两者的正则表达式。

以下正则表达式将分别提取 IP 地址和 (gmail) 域名:

\b(?:[0-9]1,3\.)3[0-9]1,3\b
mail.*com

在 Python 中组合两个或多个模式最优雅的方法是什么?我将遍历 Receive 字段列表并对每个字段运行正则表达式。

【问题讨论】:

你想从你的输入中提取什么? 你也应该考虑支持ipv6地址 【参考方案1】:

如果您只想捕获跃点的所有域和 IP,您可以像这样使用正则表达式。

在python中:

import re
pat = r'(?:by|for|from) <?([^\s;>]+)'
print(re.findall(pat, text))

->

['10.194.174.73', '10.180.14.233', 'mail-wg0-f52.google.com', 'mail-ie0-x247.google.com', 'myemailaddress@gmail.com>']

(编辑以捕获电子邮件)

【讨论】:

啊。那么在这种情况下,也许可以尝试这样的事情: (?:by|for|from) ([^\s;]+)> 在括号中省略电子邮件地址和重复的域。完美的。事情是:在运行正则表达式之前,我已经从每个中删除了“Received:”。所以有问题的字符串都是这样开始的:“by ...”。我试过简单地删除 (?:X-)?Received: (?:by|from) 部分,只留下 ([^ \n]+),但剩余的模式匹配只返回“by”。有什么建议吗? @PadraicCunningham 和 timoh:我应该提到我希望忽略电子邮件地址(在这种情况下,当然,我原来的 'mail.*com' 是不够的)。 @Pyderman 你能用正则表达式需要匹配的实际数据更新问题吗?如果您将当前未更改的数据与 '(?:by|from) ([^\s>]+)' 一起使用,它将匹配所有收到的域和 IP 地址,而不是电子邮件。 如果你使用 re.findall() 那么你不会得到 by 或 from -parts 作为结果,因为那是一个非捕获组。您应该只获得 IP/主机 - 我没有修改我附加到我的答案的输出。【参考方案2】:

为什么不使用替代?

patterns = [r"\b(?:[0-9]1,3\.)3[0-9]1,3\b", r"mail.*com"]
pattern = "|".join(patterns)  # pattern1|pattern2|pattern3|...

re.findall(pattern, text)

产量

['10.194.174.73',
 '10.180.14.233',
 'mail-wg0-f52.google.com',
 'mail-ie0-x247.google.com',
 'mailaddress@gmail.com']

【讨论】:

不错。我正在尝试省略电子邮件地址。将 r"mail.*.com" 更改为 r'\smail.*com' 就足够了,除了(我没有提到这一点)一些标头包含域,然后在括号中再次包含域。例如收到:来自 mail-ie0-x247.google.com (mail-ie0-x247.google.com. [2607:f8b0:4001:c03::247]),并且您的模式匹配两者。我们如何处理这两种情况(省略电子邮件地址和每行重复的域)?

以上是关于python中如何将两个列表组合成字典,并存放于一个新字典中的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中把两个列表的各项分别合并为列表

如何将两个数组合并到字典中?

将3个列表解析为python中的字典列表

python爬虫同时输出两个列表(zip函数)

将两个 Int32 组合成一个 Int64

python3将两个列表合并成字典的三种方法