【发布时间】:2020-03-04 18:36:51
【问题描述】:
我在 mylist 中有一个记录列表,我想遍历该列表,直到在我的 rules 中找到满足所有 3 个规则的 first record 列表。我正在尝试使用嵌套列表推导,因为我认为它比嵌套 for 循环更快,但是,我的逻辑有点复杂,我不确定列表推导是否可行。这是我的代码:
import operator
import timeit
def check(rec, vl, op, vr):
operations = {'>': operator.gt,
'<': operator.lt,
'>=': operator.ge,
'<=': operator.le,
'=': operator.eq,
'!=': operator.ne}
return operations[op](vl, vr)
mylist = [{'criteria': {'shipping_point': '3000', 'from_tot_weight': '250', 'to_tot_weight': '999999'}, 'result': {'ship_type': '02'}}, {'criteria': {'shipping_point': '3200', 'from_tot_weight': '350', 'to_tot_weight': '999999'}, 'result': {'ship_type': '02'}}]
rules = [{'varL': ['rec', 'criteria', 'shipping_point'], 'operator': '=', 'varR': "3000"},
{'varL': ['rec', 'criteria', 'from_tot_weight'], 'operator': '<=', 'varR': "250"},
{'varL': ['rec', 'criteria', 'to_tot_weight'], 'operator': '>=', 'varR': "250"}]
def run_1():
newlist = [rec for rec in mylist if all(check(rec, locals()[rule['varL'][0]][rule['varL'][1]][rule['varL'][2]],
rule['operator'],
rule['varR'])
for rule in rules)]
print(newlist)
def run_2():
found = False
result = []
for rec in mylist:
for rule in rules:
if check(rec, locals()[rule['varL'][0]][rule['varL'][1]][rule['varL'][2]],
rule['operator'],
rule['varR']):
found = True
else:
found = False
break
if found:
result = rec
break
print(result)
run_count = 1
print("==========List Comprehension with Locals()==========")
print(timeit.timeit(run_1, number=run_count))
print(" ")
print("==========Nested for loops==========================")
print(timeit.timeit(run_2, number=run_count))
在这段代码中,当我找到满足 rules 列表中所有规则的记录时,我的列表理解不会停止。实际上,如果您将 mylist 中的两条记录都更改为 shipping_point = 3000,那么列表推导会产生不正确的结果。我认为这就是为什么它比嵌套的 for 循环需要更长的时间。甚至可以将此嵌套的 for 循环转换为嵌套的列表理解吗?谢谢
【问题讨论】:
-
“我正在尝试使用嵌套列表推导,因为我认为它比嵌套 for 循环更快” - 列表推导并不神奇;它们的工作方式与循环完全相同,只是语法不同。性能差异将是微不足道的。
标签: python list-comprehension operator-keyword