我有以下程序:
random_pool=[[[0, 2, 3, 1, 3, 2, 0, 1], [0, 1], [1], [0]],
[[0, 3, 2, 1, 2, 3, 0, 1], [0, 3], [3], [1]],
[[1, 2, 3, 0, 3, 2, 1, 0], [2, 2], [4], [2]],
[[2, 1, 3, 0, 3, 1, 2, 0], [2, 1], [3], [3]]]
binary_list=[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1],
[0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1],
[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0],
[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0]]
def GeneratePopulation(random_pool, binary_list):
individual = []
population = []
for gene in range(0, len(binary_list)):
gene=binary_list[gene]
for game in range (0, len(random_pool)):
fitness=random_pool[game][2]
counter=random_pool[game][3]
individual=[gene,fitness,counter]
population.append(individual)
return(population)
输出:
[[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [1], [0]],
[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [3], [1]],
[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [4], [2]],
[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [3], [3]],
[[0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1], [1], [0]],
[[0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1], [3], [1]],
[[0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1], [4], [2]],
[[0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1], [3], [3]],
[[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [1], [0]],
[[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [3], [1]],
[[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [4], [2]],
[[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [3], [3]],
[[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0], [1], [0]],
[[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0], [3], [1]],
[[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0], [4], [2]],
[[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0], [3], [3]]]
我的目标是将binary_list中的元素gene(二进制向量)与random_pool列表中每个项目的最后两个元素结合起来,因此正确的结果将是:
[[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [1], [0]],
[[0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1], [3], [1]]
[[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [4], [2]],
[[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0], [3], [3]]]
我知道循环有问题,但我已经尝试了很多东西而且我无法得到我想要的结果。任何人都可以告诉我我做错了什么或者解决了什么问题?
谢谢!
答案 0 :(得分:2)
这是您的函数版本,它将提供预期的结果:
result= $(ls -l /etc|wc -l)
sed -i "s|var=SOMEPLACEHOLDER|var='$result'|" path/to/script_B.sh
在原始代码中,循环为def GeneratePopulation(random_pool, binary_list):
individual = []
population = []
for ind in range(0,len(binary_list)):
fitness = random_pool[ind][2]
counter = random_pool[ind][3]
gene = binary_list[ind]
individual=[gene,fitness,counter]
population.append(individual)
return(population)
中的每个元素迭代random_pool
- 这是不必要的,并产生重复的结果。
请注意,变量binary_list
,fitness
和counter
在这里是多余的 - 您可以在不创建变量的情况下获得相同的结果。你还需要其他东西吗?
答案 1 :(得分:2)
更加pythonic的解决方案是zip列表,这样您就可以同时迭代random_pool
和binary_list
,而不必使用索引。
您也可以通过以下方式解压缩池:*_, fitness, counter = pool
。 *_
会将第一个项目解压缩到变量_
中,该变量通常用于不需要的值,后两个项目将解压缩到变量fitness
和counter
中。
def generate_population(random_pool, binary_list):
population = []
for pool, gene in zip(random_pool, binary_list):
*_, fitness, counter = pool # Unpack the pool. Ignore the first two items.
population.append([gene, fitness, counter])
return population
使用list comprehension或生成器表达式,您可以进一步减少功能。
def generate_population(random_pool, binary_list):
return [[gene, fitness, counter]
for (*_, fitness, counter), gene in zip(random_pool, binary_list)]