要更新变量的值?

时间:2013-08-20 06:39:36

标签: python

请考虑以下代码:

l=[21,23,25,30,33,45,56,67,70,77--------------------]
h=35
r1=[]; r2=[]
for i in range(len(l)):
   if(l[i] < h):
      r1.append(l[i])
   else:
      r2.append(l[i])
print r1
print r2

获得的结果是:

[21, 23, 25, 30, 33]
[45, 56, 67, 70, 77----------------------]

现在我需要增加h = 35,这样当它达到46时,它的输出必须是

[21, 23, 25, 30, 33,45]
[56, 67, 70, 77----------------------]

接下来当h达到57

[21, 23, 25, 30, 33,45,56]
[67, 70, 77-------------------------]

总的来说,最终结果应该显示:

[21, 23, 25, 30, 33]
[45, 56, 67, 70, 77-----------------]

[21, 23, 25, 30, 33,45]
[56, 67, 70, 77---------------]

[21, 23, 25, 30, 33,45,56]
[67, 70, 77--------------]

[21, 23, 25, 30, 33,45,56,67]
[70, 77--------------]

[21, 23, 25, 30, 33,45,56,67,70]
[77--------------]

[21, 23, 25, 30, 33,45,56,67,70,77]
[-----------------------]

什么会在python中产生这样的结果而不将其作为函数参数传递?有人可以为它建议代码..........

5 个答案:

答案 0 :(得分:5)

除了jimifiki的答案之外,代码可以简化并变得更加pythonic。

def funct(h):
    l = [21,23,25,30,33,45,56,67,70,77]
    r1=[]; r2=[]
    for x in l:
        if x < h:
           r1.append(x)
        else:
           r2.append(x)

    print r1
    print r2

for h in (35,45,55,65):
    funct(h) 

答案 1 :(得分:3)

h设为函数的参数,并使用所需的h调用该函数。

def funct(h, l):
    r1=[]; r2=[]
    for i in range(len(l)):
        if(l[i] < h):
           r1.append(l[i])
        else:
           r2.append(l[i])
    print r1
    print r2

longL = [21,23,25,30,33,45,56,67,70,77]
for h in (35,46,57,68):
    funct(h, longL) 

答案 2 :(得分:1)

这是另一种方法:

l=[21,23,25,30,33,45,56,67,70,77]

def splitAt(data, point):
    less = [c for c in data if c < point ]
    more = [c for c in data if c >= point ]
    return [less,more]

print(splitAt(l, 35))

Split at返回两个数组的数组,第一个是小于的值,第二个是大于(或等于)的值

[[21, 23, 25, 30, 33], [45, 56, 67, 70, 77]]

答案 3 :(得分:0)

如果您可以保证输入列表已排序(或者可以这样做),并且您的拆分值也已排序,那么您可以使用bisect,并继续搜索上一点。您需要调整以下内容以使用超出边界所需的任何行为:

import bisect

def split_list_at(L, points):
    pos = 0
    for val in points:
        pos = bisect.bisect_left(L, val, pos)
        yield L[:pos], L[pos:]

l=[21,23,25,30,33,45,56,67,70,77]
h = 35,46,57

for first, second in split_list_at(l, h):
    print first, second

并且,作为测试(看看你是否获得了正确的边界结果):

for idx, lists in enumerate(split_list_at(l, xrange(100)):
    print idx, lists

答案 4 :(得分:0)

def spli(L,st,nd):
    if L[0]<st<=nd<=L[-1]:
        i = (j for j in xrange(1,len(L)) if L[j] >= st).next()
        first  = L[:i-1]
        second = L[i-1:]
        while second and second[0]<nd:
            first.append(second.pop(0))
            yield first,second

l=[21,23,25,30,33,45,56,67,70,77]
print '\n'.join('{}\n{}\n'.format(*x) for x in spli(l,35,67))

结果

[21, 23, 25, 30, 33]
[45, 56, 67, 70, 77]

[21, 23, 25, 30, 33, 45]
[56, 67, 70, 77]

[21, 23, 25, 30, 33, 45, 56]
[67, 70, 77]

表达式(j for j in xrange(1,len(L)) if L[j] >= st)是一个生成器,它生成L的元素的所有索引,这些索引大于或等于值st
.next()放在此表达式后面只会给出第一个索引 拥有第一个索引,我们从前一个索引开始。肯定有前一个,因为条件L[0]<st可以保证它 我们从前一个开始,因为我把第二个的第一个元素的指令first.append(second.pop(0))放到第一个的结尾处和第二
我选择了这一连串的说明,以便测试second[0]<nd不会让结果L []屈服

此代码使用值nd。如果您不希望在达到原始列表的末尾之前停止分割列表的产生,则可将其修改为:

def spli(L,st):
    if L[0]<st:
        i = (j for j in xrange(1,len(L)) if L[j] >= st).next()
        first  = L[:i]
        second = L[i:]
        while second:
            yield first,second
            first.append(second.pop(0))

在此解决方案中,不需要事先知道值35,46,57并将其写入代码中。该算法是为了在执行期间找到这些值,无论它们是什么。