python 如何让for循环进入列表解析?

hfwmuf9z  于 2023-02-02  发布在  Python
关注(0)|答案(3)|浏览(158)

我的for循环如下所示:

Object_id_lst = []

for id_tic in ticket_df['ID']:
    get_object_id = api_client.crm.tickets.associations_api.get_all(ticket_id=id_tic, to_object_type='contacts')
    if len(get_object_id.results) > 0:
        Object_id_lst.append(get_object_id.results[0].to_object_id)
    else:
        object_id = 0
        Object_id_lst.append(object_id)

我想看看是否有一种方法可以将其转换为列表理解,从而缩短计算时间。

qoefvg9y

qoefvg9y1#

我不认为列表解析会有多大帮助,其他优化可能会有更大帮助。

Object_id_lst = [
    results[0].to_object_id if results else 0
    for get_all in [api_client.crm.tickets.associations_api.get_all]
    for id_tic in ticket_df['ID']
    for results in [get_all(ticket_id=id_tic, to_object_type='contacts').results]
]

我的优化(除了理解):

  • 只获取get_all函数一次,而不是每次。
  • 只提取.results一次而不是两次。
  • 检查results的真值,而不是在其上调用len,与0进行比较,并检查比较结果的真值。

另一种选择(应该在函数中,而不是全局的,这样你可以得到更快的变量):

Object_id_lst = []
append = Object_id_lst.append
get_all = api_client.crm.tickets.associations_api.get_all
for id_tic in ticket_df['ID']:
    for result in get_all(ticket_id=id_tic, to_object_type='contacts').results:
        append(result.to_object_id)
        break
    else:
        append(0)
uxh89sit

uxh89sit2#

这并不漂亮,但是可以通过使用walrus操作符在列表解析中赋值get_object_id来实现,这样就可以测试它的长度,也可以在解析的值部分使用它。

Object_id_list = [
    get_object_id.results[0].to_object_id 
        if len((get_object_id := api_client.crm.tickets.associations_api.get_all(ticket_id=id_tic, to_object_type='contacts')).results) > 0 
        else 0
    for id_tic in ticket_df['ID']]

更实际地说,我会将所有条件代码移到一个函数中,并Map它。

def object_id(id_tic):
    get_object_id = api_client.crm.tickets.associations_api.get_all(ticket_id=id_tic, to_object_type='contacts')
    if len(get_object_id.results) > 0:
        return get_object_id.results[0].to_object_id
    else:
        return 0

Object_id_list = list(map(object_id, ticket_df['ID']))
z4iuyo4d

z4iuyo4d3#

Object_id_list = [api_client.crm.tickets.associations_api.get_all(ticket_id=id_tic, to_object_type='contacts').results[0].to_object_id 
                  if len(api_client.crm.tickets.associations_api.get_all(ticket_id=id_tic, to_object_type='contacts')) > 0
                  else 0
                  for id_tic in ticket_df['ID']]

相关问题