gpt4 book ai didi

python - 基于模式分离列表的最优雅方式(Python)

转载 作者:太空狗 更新时间:2023-10-29 22:24:49 25 4
gpt4 key购买 nike

我有一个 pandas 列,其中包含用户执行的连续日志操作列表,同时在每个整个日志记录 session 中在移动应用程序中发布一张照片。假设单个列表如下所示:

my_list = [
'action_a', 'action_b', 'action_c', 'action_z',
'action_j',
'action_a','action_b',
'action_a', 'action_b', 'action_z']

1) action_a - 照片上传开始

2) action_z - 照片上传结束

3) other actions_i - action_a 和 action_z 之间可以发生的所有 Action 。

4) 可能存在错误,例如“action_j”,不在“action_a”、“action_z”之间,我们不应该考虑这些错误

5) 照片上传过程可能未完成 - 因此可能存在类似“action_a”、“action_b”的路径。

GOAL = 将 my_list 分成所有 Action 路径的子列表,这些路径以“action_a”开始并以“action_z”结束或在另一个“action_a”之前结束。所以结果应该是这样的:

['action_a', 'action_b', 'action_c', 'action_z'] 
['action_a','action_b']
['action_a', 'action_b', 'action_z']

所以目前我正在尝试这样解决它:首先我删除了所有 my_lists,其中 'action_z' 的数量大于 'action_a' 的数量或者没有 'action_a' 的地方。然后我这样做了:

indices_a = [i for i, x in enumerate(my_list) if x == "action_a"]
indices_z = [i for i, x in enumerate(my_list) if x == "action_z"]

if(len(indices_z)<1):
for i_a,x_a in enumerate(indices_a):
if (i_a+1 != len(indices_a)):
indices_z.append(indices_a[i_a+1]-1)
else: indices_z.append(len(my_list)-1)
else:
for i_a,x_a in enumerate(indices_a):
if (i_a+1 != len(indices_a)):
if (indices_z[i_a] > indices_a[i_a+1] ):
indices_z.insert(i_a, indices_a[i_a+1]-1)
else: indices_z.append(len(my_list)-1)

res=[]
for i,j in zip(indices_a, indices_z):
res.append(my_list[i:j+1] )

看起来好像有效。什么是更好的方法?

最佳答案

我试图稍微简化一些事情并想出了这个逻辑:

result = []
curr_list = None

for item in my_list:
if item == 'action_a':
if curr_list is not None:
# Only append is there is content
result.append(curr_list)
# Create a new list
curr_list = []

try:
# Try to append the current item
curr_list.append(item)

if item == 'action_z':
# Close the current list but don't initialize
# a new one until we encounter action_a
result.append(curr_list)
curr_list = None
except AttributeError:
# This means we haven't encountered action_a yet
# Just ignore and move on
pass

if curr_list is not None:
# Append an "open" list if there is one
result.append(curr_list)

for item in result:
print(item)

结果:

['action_a', 'action_b', 'action_c', 'action_z']
['action_a', 'action_b']
['action_a', 'action_b', 'action_z']

关于python - 基于模式分离列表的最优雅方式(Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44604224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com