请考虑以下代码:
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中产生这样的结果而不将其作为函数参数传递?有人可以为它建议代码..........
答案 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并将其写入代码中。该算法是为了在执行期间找到这些值,无论它们是什么。