排列和索引,python
Permutations and indexes, python
我创建了一个列表,其中包含 0,1,2
的所有排列
perm = list(itertools.permutations([0,1,2]))
这用于按特定顺序访问另一个列表中的索引。每次访问索引时,都会将其弹出。
当一个元素被弹出时,索引高于弹出元素索引的元素将向下移动一个位置。这意味着如果我想按索引 [0,1,2] 从我的列表中弹出它会导致索引错误,因为当我到达它时索引 2 将不存在。因此,[0,1,2] 应该按 [0,0,0].
的顺序弹出
更多例子是
[0,2,1] = [0,1,0]
[2,0,1] = [2,0,0]
[1,2,0] = [1,1,0]
现在这正在通过一系列检查来处理,我的问题是是否有人知道将 itertools 生成的列表列表转换为所需列表的聪明方法:
[(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)]
[(0, 0, 0), (0, 1, 0), (1, 0, 0), (1, 1, 0), (2, 0, 0), (2, 1, 0)]
简单地遍历每个元组,并递减大于该元素的每个后续索引的索引:
l=[(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)]
def lower_idxs(lst):
new_row = list(lst)
for i, val in enumerate(new_row):
for j in xrange(i+1, len(new_row)):
if new_row[i] < new_row[j]:
new_row[j] -= 1
return new_row
print [lower_idxs(x) for x in l]
会打印出来
[[0, 0, 0], [0, 1, 0], [1, 0, 0], [1, 1, 0], [2, 0, 0], [2, 1, 0]]
这是基于 Randy C 解决方案的更高级的单行代码:
print [tuple(y-sum(v<y for v in x[:i]) for i,y in enumerate(x)) for x in l]
这是一个单行代码(假设您的列表是 l):
[v-sum(v>v2 for v2 in l[:k]) for k, v in enumerate(l)]
我创建了一个列表,其中包含 0,1,2
的所有排列perm = list(itertools.permutations([0,1,2]))
这用于按特定顺序访问另一个列表中的索引。每次访问索引时,都会将其弹出。 当一个元素被弹出时,索引高于弹出元素索引的元素将向下移动一个位置。这意味着如果我想按索引 [0,1,2] 从我的列表中弹出它会导致索引错误,因为当我到达它时索引 2 将不存在。因此,[0,1,2] 应该按 [0,0,0].
的顺序弹出更多例子是
[0,2,1] = [0,1,0]
[2,0,1] = [2,0,0]
[1,2,0] = [1,1,0]
现在这正在通过一系列检查来处理,我的问题是是否有人知道将 itertools 生成的列表列表转换为所需列表的聪明方法:
[(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)]
[(0, 0, 0), (0, 1, 0), (1, 0, 0), (1, 1, 0), (2, 0, 0), (2, 1, 0)]
简单地遍历每个元组,并递减大于该元素的每个后续索引的索引:
l=[(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)]
def lower_idxs(lst):
new_row = list(lst)
for i, val in enumerate(new_row):
for j in xrange(i+1, len(new_row)):
if new_row[i] < new_row[j]:
new_row[j] -= 1
return new_row
print [lower_idxs(x) for x in l]
会打印出来
[[0, 0, 0], [0, 1, 0], [1, 0, 0], [1, 1, 0], [2, 0, 0], [2, 1, 0]]
这是基于 Randy C 解决方案的更高级的单行代码:
print [tuple(y-sum(v<y for v in x[:i]) for i,y in enumerate(x)) for x in l]
这是一个单行代码(假设您的列表是 l):
[v-sum(v>v2 for v2 in l[:k]) for k, v in enumerate(l)]