简体   繁体   English

遍历列表和自动化算法的问题

[英]Problem with Iterating through a list and automating algorithm

With reference to the codes below, is there a way for me to automatically loop through open_count and close_count to create trips_check?参考下面的代码,有没有办法让我自动循环遍历 open_count 和 close_count 来创建trips_check? I have been manually typing in the variables 'Open_1', 'Close_1' ... into trip_check whenever a new variable is added, which I find to be inefficient.每当添加新变量时,我一直在将变量“Open_1”、“Close_1”...手动输入到trip_check 中,我发现这是低效的。

door_dur_log = pd.DataFrame([[1, 2.029, 2.208, np.nan, np.nan, 3.01, np.nan, np.nan],
[2, 2.029, 2.208, np.nan, np.nan, 3.01, 2.42, np.nan],
[3, 1.266, np.nan, np.nan, np.nan, 3.846, np.nan, np.nan],
[4, 1.266, 2.224, np.nan, np.nan, 3.846, 3.102, np.nan],
[5, 3.102, 2.923, 3.156, np.nan, 1.318, 2.186, np.nan],
[6, 2.156, np.nan, np.nan, np.nan, 3.039, np.nan, np.nan],
[7, 2.13, 2.195, np.nan, np.nan, 2.982, 2.817, np.nan],
[8, 2.552, np.nan, np.nan, np.nan, 2.408, np.nan, np.nan]], columns = ['Trip', 'Open_1', 'Open_2', 'Open_3', 'Open_4', 'Close_1', 'Close_2', 'Close_3'])

open_count = ['Open_1', 'Open_2', 'Open_3', 'Open_4']
close_count = ['Close_1', 'Close_2', 'Close_3']

trips_check = door_dur_log[(door_dur_log['Open_1'] > 2.75)|(door_dur_log['Open_1'] < 1) | 
                           (door_dur_log['Open_2'] > 2.75)|(door_dur_log['Open_2'] < 1) | 
                           (door_dur_log['Open_3'] > 2.75)|(door_dur_log['Open_3'] < 1) |
                           (door_dur_log['Open_4'] > 2.75)|(door_dur_log['Open_4'] < 1) |
                           (door_dur_log['Close_1'] > 2.75)|(door_dur_log['Close_1'] < 1)|
                           (door_dur_log['Close_2'] > 2.75)|(door_dur_log['Close_2'] < 1)|
                           (door_dur_log['Close_3'] > 2.75)|(door_dur_log['Close_2'] < 1)]

You could do the following您可以执行以下操作

from functools import reduce

lb_open = [door_dur_log[_] > 2.75 for _ in open_count]
lb_close = [door_dur_log[_] > 2.75 for _ in close_count]
ub_open = [door_dur_log[_] < 1 for _ in open_count]
ub_close = [door_dur_log[_] < 1 for _ in close_count]

constraints = [*lb_open, *lb_close, *ub_open, *ub_close]
combined = reduce(lambda a, b : a|b, constraints)

trips_check = door_dur_log[combined]

The first 4 lines are by list comprehension .前 4 行是列表理解

The * operator unpacks a list. *操作符解包一个列表。 It can be used to combine different lists.它可用于组合不同的列表。 For example,例如,

a = [1,2,3]
b = [4,5,5]
c = [*a, *b] # c = [1,2,3,4,5,5]

Lastly, the reduce operation takes a binary operation and accumulates the result by applying the operation on the result accumulated so far and the next element in the list.最后, reduce操作采用二元操作,并通过对迄今为止累积的结果和列表中的下一个元素应用该操作来累积结果。 For example,例如,

a = reduce(lambda x, y : x + y, [1,2,3,4]) # a = 10

More information can be found here .可以在此处找到更多信息。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM