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
有关。