Python 具有动态变量属性的列表理解

Python 具有动态变量属性的列表理解,python,list-comprehension,Python,List Comprehension,通常,列表理解遵循以下模式: my_list = [record for record in records_set] 例如,如果记录是字典,则可以将其扩展为以下表达式: my_list = [(record['attribute_a'],record['attribute_b']) for record in records_set] 如果我想让列表理解将我想从记录中提取的属性列表作为参数,该怎么办 假设我有一张清单 attributes_list = ['attribute_a','at

通常,列表理解遵循以下模式:

my_list = [record for record in records_set]
例如,如果记录是字典,则可以将其扩展为以下表达式:

my_list = [(record['attribute_a'],record['attribute_b']) for record in records_set]
如果我想让列表理解将我想从记录中提取的属性列表作为参数,该怎么办

假设我有一张清单

attributes_list = ['attribute_a','attribute_b','attribute_c']
将其应用于列表理解模式后,我希望得到以下列表理解结果:

my_list = [(record['attribute_a'],record['attribute_b'],record['attribute_c']) for record in records_set]
我该怎么做?

您可以做:

my_list =  [tuple(record[attr] for attr in attributes_list) for record in records_set]

最简单的方法是使用
操作符.itemgetter

from operator import itemgetter
values_from = itemgetter(*attributes_list)
my_list = [values_from(record) for record in record_set]
这样可以轻松跳过列表理解,而使用
map

my_list = list(map(itemgetter(*attributes_list), record_set))

(通常,Python 3中需要调用
list
,而不是Python 2。)

注意:在listcomp中,最好将
itemgetter
放在listcomp之外并重用它,因为反复创建getter会产生成本,应该避免这种成本<代码>映射避免了这种成本。您知道在Python 3中是否仍然是这样吗?查看Python 2中的字节码,很明显,
itemgetter
被重复调用。我不太清楚Python3中到底发生了什么。在Python3中,listcomp是一个闭包,它向反汇编程序隐藏它,但是如果深入研究,它仍然必须在每次调用它之前创建
itemgetter
。您仍然可以有效地将其一行,但使用
[值(记录)中的值(itemgetter(*attributes\u list)中的值(记录中的值),)记录集中的记录]
来匹配
map
的行为,这是一种丑陋的方式。好吧,我想这与创建匿名
listcomp
有关。