将来自不同列表的选定项目组合成一个新项目

时间:2017-11-04 16:26:51

标签: python python-3.x list loops genetic-programming

我有以下程序:

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]]]

我知道循环有问题,但我已经尝试了很多东西而且我无法得到我想要的结果。任何人都可以告诉我我做错了什么或者解决了什么问题?

谢谢!

2 个答案:

答案 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_listfitnesscounter在这里是多余的 - 您可以在不创建变量的情况下获得相同的结果。你还需要其他东西吗?

答案 1 :(得分:2)

更加pythonic的解决方案是zip列表,这样您就可以同时迭代random_poolbinary_list,而不必使用索引。

您也可以通过以下方式解压缩池:*_, fitness, counter = pool*_会将第一个项目解压缩到变量_中,该变量通常用于不需要的值,后两个项目将解压缩到变量fitnesscounter中。

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)]