通过返回键值对的转换函数将列表扩展为 python 中的字典

Expanding a list into a dictionary in python through a transformation function returning key-value pairs

我正在尝试从一个列表生成一个字典和一个从所述列表的元素计算键值对的函数,例如在

def transform(element):
    key = f"{element}^2"
    value = element**2
    return key, value

elements = [1, 2, 3]
elements_dict = {k: v for (k, v) in [transform(elem) for elem in elements]}

# elements_dict should be {'1^2': 1, '2^2': 4, '3^2': 9}

但是,这个元素列表可能非常大,需要及时处理,这使得生成中间数组既不切实际又低效。

有没有办法做到这一点,以便从原始列表中延迟读取元素,通过函数将其转换为键值对,并存储在字典中而不生成任何中间结构?

transform功能的使用也是没有商量余地的;这里提供的是一个最小的工作示例,但是它们的实际功能要复杂得多,不能简单地写成字典理解的一部分。

您可以使用内置的 map 函数。

elements_dict = {k: v for (k, v) in map(transform, elements)}

如果您知道可能不会调用所有键并且您想将 LaziNess 添加到您的字典中,我建议您实现自己的 class,它只在它们出现时计算值需要,例如:

def transform(element):
    key = f"{element}^2"
    value = element**2
    return key, value


class LazyDict:
    def __init__(self):
        self.d = dict()

    def get_key(self, i):
        return f"{i}^2"

    def get(self, i):
        if self.get_key(i) in self.d.keys():
            return self.d[self.get_key(i)]
        else:
            self.d.update({transform(i)})
            return self.d[self.get(i)]


d = LazyDict()
d.get(4)
# 16

因为如果我们比较建议的不同实施的时间,并没有太大的不同

import time
def transform(element):
    key = f"{element}^2"
    value = element**2
    return key, value

elements = list(range(1000000))

# Evaluating first scenario
t1 = time.time()
elements_dict = {k: v for (k, v) in [transform(elem) for elem in elements]}
t2 = time.time()
print(f'Difference 1 = {t2 - t1}')
#0.798

# Evaluating second scenario
t1 = time.time()
elements_dict = {k: v for (k, v) in map(transform, elements)}
t2 = time.time()
print(f'Difference 2 = {t2 - t1}')
#0.740