匿名用户
1级
2016-03-18 回答
this performs the same function as itertools.permutations
for i in range(len(l)):
s=l[:i]+l[i+1:]
These two lines can iterate all cases of permutations(order not considered) of the list's sublist of (len(list)-1)
So, like you have [1,2,3]
By this, you can iterate through:
[2,3], [1,3], [1,2]
Then you recurse it till the list is of length 1.
p = perm(s)
so, for [2,3], you get [2] and [3]
for [1,3], you get [1] and [3]
for [1,2], you get [1, 2]
Then these codes considers the order.
for x in p:
r.append(l[i:i+1]+x)
After this two processing, you can get [2,3] and [3,2] from [2,3]
[2,3] + [1] = [2,3,1]
[3,2] + [1] = [3,2,1]
So you get all cases when 2,3 is the first two of the permutations.
Well, hope this helps you.
Also, this is a equivalent function of permutations :
This returns an iterable, and I believe it is more efficient.
def permutations(iterable, r=None):
# permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
# permutations(range(3)) --> 012 021 102 120 201 210
pool = tuple(iterable)
n = len(pool)
r = n if r is None else r
if r > n:
return
indices = range(n)
cycles = range(n, n-r, -1)
yield tuple(pool[i] for i in indices[:r])
while n:
for i in reversed(range(r)):
cycles[i] -= 1
if cycles[i] == 0:
indices[i:] = indices[i+1:] + indices[i:i+1]
cycles[i] = n - i
else:
j = cycles[i]
indices[i], indices[-j] = indices[-j], indices[i]
yield tuple(pool[i] for i in indices[:r])
break
else:
return
追问:
Then these codes considers the order.
order 是怎么产生的,麻烦再回答一下啦