最小化if函数中的if语句

时间:2018-01-30 15:56:14

标签: python pandas dataframe

我有以下函数,它从pandas dataframe列获取值并提供参数(s0_loc,s1_loc,.. upto ..,s12_loc当且仅当它们各自的s0,s1,s2 ...,s12不为null时)到另一个功能。此外,当且仅当s0不为空时,它将检查s1是否为空...类似地,它将检查s2是否为空,如果s0,s1不为空..那么...

基于以上标准,我写了以下功能。但它的功能很长......我想减少这个函数中的代码片段。

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)

我可以就如何实现这个问题得到任何建议吗?

3 个答案:

答案 0 :(得分:6)

要使用Sandeep的答案,您可以从巨大的参数列表中在本地构建两个列表:

update t 
    set comment = x.comments
    from test as t 
    inner join @temp x on x.LoadId = t.LoadId;

答案 1 :(得分:2)

为什么不接收两个数组,一个用于s,另一个用于s_loc?你可以验证长度并使用for循环进行数组构建吗?由于后续添加的数组取决于以前的添加,如果您不知道它,可能需要查看break语句。

答案 2 :(得分:2)

迭代列表。没有中间grouped列表,我没能让它工作。另请参阅iterating over two values of a list at a time in python

经过测试(3.5):

>>> 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']

当然,如果您首先有两个列表,则可以跳过合并并再次分离它们。