python字典推导式

332 阅读2分钟

字典推导式(Dictionary Comprehension)是Python中用于创建字典的一种简洁、可读的方式。这种方式类似于列表推导式(List Comprehension),但是用于生成字典对象而不是列表。

基本的字典推导式形式如下:

{key_expr: value_expr for item in iterable}
  • key_expr:用于生成字典键的表达式。
  • value_expr:用于生成字典值的表达式。
  • item:迭代变量,用于遍历iterable
  • iterable:一个可迭代对象。

示例

假设你有一个列表,你想创建一个字典,其中列表中的每个元素都是键,而值是该元素的平方。

使用传统的for循环,你可以这样做:

my_list = [1, 2, 3, 4]
my_dict = {}
for item in my_list:
    my_dict[item] = item ** 2

使用字典推导式,你可以将这个逻辑简化为一行:

my_dict = {item: item ** 2 for item in [1, 2, 3, 4]}

两者生成的my_dict都是:

{1: 1, 2: 4, 3: 9, 4: 16}

带有条件的字典推导式

你还可以在字典推导式中使用if条件:

my_dict = {item: item ** 2 for item in [1, 2, 3, 4] if item % 2 == 0}

这将只包括列表中的偶数元素,生成的my_dict将是:

{2: 4, 4: 16}

字典推导式是一种非常强大的工具,可以让你的代码更简洁和可读。然而,与所有编程工具一样,应适度使用,以保持代码的可维护性。

场景:多线程请求结果

from concurrent.futures import ThreadPoolExecutor, as_completed
import requests

# 定义一个简单的函数,用于请求一个网站并返回其状态码
def fetch_status(url):
    response = requests.get(url)
    return response.status_code

# 主函数
def main():
    urls = [
        "https://www.google.com",
        "https://www.yahoo.com",
        "https://www.bing.com",
        "https://www.duckduckgo.com"
    ]
    
    # 使用ThreadPoolExecutor进行多线程请求
    with ThreadPoolExecutor() as executor:
        # 使用字典推导式提交所有任务,并获取Future对象
        # 这里,每个Future对象(代表一个异步执行的fetch_status函数调用)映射到一个URL
        future_to_url = {executor.submit(fetch_status, url): url for url in urls}
        
        # 使用as_completed迭代已完成的Future对象
        for future in as_completed(future_to_url):
            url = future_to_url[future]
            try:
                status_code = future.result()
                print(f"The status code for {url} is {status_code}")
            except Exception as e:
                print(f"Fetching {url} generated an exception: {e}")

if __name__ == "__main__":
    main()