首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最小化python函数中的if语句

最小化python函数中的if语句
EN

Stack Overflow用户
提问于 2018-01-30 23:56:14
回答 3查看 217关注 0票数 1

我有以下函数,该函数从pandas数据框列中获取值并提供参数(s0_loc,s1_loc,..当且仅当它们各自的s0、s1、s2...、s12不为空时)到另一个函数。当且仅当s0不为null时,它才会检查s1是否为null...类似地,当s0,s1不为null时,它将检查s2是否为null。所以..

基于上述标准,我编写了以下函数。但这是一个冗长的函数。我想减少这个函数中的代码段。

代码语言:javascript
复制
def compare_locality(p,p_loc,s0,s0_loc,s1,s1_loc,s2,s2_loc,s3,s3_loc,s4,s4_loc,s5,s5_loc,s6,s6_loc,s7,s7_loc,s8,s8_loc,s9,s9_loc,s10,s10_loc,s11,s11_loc,s12,s12_loc):
    loc = []
    if s0 != '' :
        loc.append(s0_loc)
        if s1 != '' :
            loc.append(s1_loc)
            if s2 != '' :
                loc.append(s2_loc)
                if s3 != '' :
                    loc.append(s3_loc)
                    if s4 != '' :
                        loc.append(s4_loc)
                        if s5 != '' :
                            loc.append(s5_loc)
                            if s6 != '' :
                                loc.append(s6_loc)
                                if s7 != '' :
                                    loc.append(s7_loc)
                                    if s8 != '' :
                                        loc.append(s8_loc)
                                        if s9 != '' :
                                            loc.append(s9_loc)
                                            if s10 != '' :
                                                loc.append(s10_loc)
                                                if s11 != '' :
                                                    loc.append(s11_loc)
                                                    if s12 != '' :
                                                        loc.append(s12_loc)
if len(loc) == 0:
    return ''
else:
    return compare(p_loc,*loc)

我能得到关于如何实现这一点的任何建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-31 00:02:22

为了配合Sandeep的回答,您可以从巨大的参数列表在本地构建两个列表:

代码语言:javascript
复制
def compare_locality(p,p_loc,s0,s0_loc,s1,s1_loc,s2,s2_loc,s3,s3_loc,s4,s4_loc,s5,s5_loc,s6,s6_loc,s7,s7_loc,s8,s8_loc,s9,s9_loc,s10,s10_loc,s11,s11_loc,s12,s12_loc):
    locs = []
    ss = [s0, s1, s2, ..., s12]
    s_locs = [s0_loc, ..., s12_loc]
    for s, s_loc in zip(ss, s_locs):
        if s == '':
            break
        locs.append(s_loc)

if len(locs) == 0:
    return ''
else:
    return compare(p_loc,*locs)
票数 6
EN

Stack Overflow用户

发布于 2018-01-30 23:58:57

为什么不接受两个数组,一个用于s,另一个用于s_loc?您可以验证长度并使用for循环构建数组吗?由于对数组的后续添加依赖于之前的添加,因此如果您不知道break语句,则可能需要查看它。

票数 2
EN

Stack Overflow用户

发布于 2018-01-31 00:06:11

遍历列表。在没有中间grouped列表的情况下,我无法让它工作。另请参见iterating over two values of a list at a time in python

已测试(3.5):

代码语言:javascript
复制
>>> li = ['a', 'ax', 'b', 'bx', '', 'cx', 'd', 'dx']
>>> it = iter(li)
>>> grouped = [(x,next(it)) for x in it]
>>> grouped
[('a', 'ax'), ('b', 'bx'), ('', 'cx'), ('d', 'dx')]
>>> loc = [y for x,y in grouped if x]
>>> loc
['ax', 'bx', 'dx']

当然,如果你一开始有两个列表,你可以跳过合并和分离它们。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48525582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档