1

考虑以下代码:

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 中产生这样的结果而不将它作为函数参数传递?任何人都可以建议它的代码......

4

5 回答 5

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) 
于 2013-08-20T06:46:05.560 回答
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) 
于 2013-08-20T06:44:31.647 回答
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]]
于 2013-08-20T06:47:26.107 回答
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 的所有大于或等于 value 的元素的索引st
放在.next()这个表达式之后只给出这些索引中的第一个。
有了第一个索引,我们从前一个索引开始。肯定有前一个,因为条件L[0]<st保证了它。
我们从前一个开始,因为我把将second的first.append(second.pop(0))一个元素移动到 first的末尾的指令放在firstsecond的产生之前。 我选择了这一系列指令,以便测试不会让结果产生
second[0]<ndL []

.

此代码使用一个值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 并将它们写入代码中。该算法是为了在执行期间找到这些值,无论它们是什么。

于 2013-08-20T11:12:20.297 回答
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
于 2013-08-20T07:15:49.137 回答