获取列表的组合,在其中选择列表中及下方的当前编号
Getting a combination of a list where it selects the current number in the list and below
我正在尝试获取所有数字组合,但这有点复杂,所以我将通过示例展示:
假设我有一个像 [5, 10, 12, 4, 6] 这样的列表
我想要 [1, 1, 1, 1, 1], [1, 2, 1, 1, 1], ... [5, 10, 12, 4, 6]
的组合
所以每个数字只会上升到它的最高点。我试过这个:
def listdir_nohidden(path):
for f in os.listdir(path):
if not f.startswith('.'):
yield f
def listdir(path):
return list(listdir_nohidden(path))
def listlen(path):
return len(list(listdir_nohidden(path)))
def randomiser(filename):
return random.randint(1,listlen(f'./{filename}'))
lengths = []
i = 0
while i < 5:
lengths.append(listlen(f'./{i}'))
i += 1
print(lengths) # ['5', '16', '16', '16', '6']
random_array = []
j = 0
while j < 30:
random_array.append([randomiser(0), randomiser(1), randomiser(2), randomiser(3), randomiser(4)])
j += 1
但有可能出现重复,而且不是真正随机的。我知道列表中的数字足够高,机会真的很小,但我实际上想生成很多这样的重复的机会。
使用itertools.product
怎么样?
import itertools
lst = [5, 10, 12, 4, 6]
output = list(itertools.product(*(range(1, k+1) for k in lst)))
print(output[:5]) # first five: [(1, 1, 1, 1, 1), (1, 1, 1, 1, 2), (1, 1, 1, 1, 3), (1, 1, 1, 1, 4), (1, 1, 1, 1, 5)]
print(output[-5:]) # last five: [(5, 10, 12, 4, 2), (5, 10, 12, 4, 3), (5, 10, 12, 4, 4), (5, 10, 12, 4, 5), (5, 10, 12, 4, 6)]
我正在尝试获取所有数字组合,但这有点复杂,所以我将通过示例展示:
假设我有一个像 [5, 10, 12, 4, 6] 这样的列表 我想要 [1, 1, 1, 1, 1], [1, 2, 1, 1, 1], ... [5, 10, 12, 4, 6]
的组合所以每个数字只会上升到它的最高点。我试过这个:
def listdir_nohidden(path):
for f in os.listdir(path):
if not f.startswith('.'):
yield f
def listdir(path):
return list(listdir_nohidden(path))
def listlen(path):
return len(list(listdir_nohidden(path)))
def randomiser(filename):
return random.randint(1,listlen(f'./{filename}'))
lengths = []
i = 0
while i < 5:
lengths.append(listlen(f'./{i}'))
i += 1
print(lengths) # ['5', '16', '16', '16', '6']
random_array = []
j = 0
while j < 30:
random_array.append([randomiser(0), randomiser(1), randomiser(2), randomiser(3), randomiser(4)])
j += 1
但有可能出现重复,而且不是真正随机的。我知道列表中的数字足够高,机会真的很小,但我实际上想生成很多这样的重复的机会。
使用itertools.product
怎么样?
import itertools
lst = [5, 10, 12, 4, 6]
output = list(itertools.product(*(range(1, k+1) for k in lst)))
print(output[:5]) # first five: [(1, 1, 1, 1, 1), (1, 1, 1, 1, 2), (1, 1, 1, 1, 3), (1, 1, 1, 1, 4), (1, 1, 1, 1, 5)]
print(output[-5:]) # last five: [(5, 10, 12, 4, 2), (5, 10, 12, 4, 3), (5, 10, 12, 4, 4), (5, 10, 12, 4, 5), (5, 10, 12, 4, 6)]