在python中更改数组值

时间:2017-11-24 07:19:28

标签: python algorithm

我编写了一个用于在Python中使用遗传算法计算函数最大值的代码。这是here

当我想更改数组的值时,出现错误:

def _crossover_chromosomes(chromosome1,chromosome2):
   crossover_chrom = Chromosome()
   for i in range(8):
     if random.random() >= 0.5:
        crossover_chrom.get_genes()[0][i] = chromosome1.get_genes()[0][i]
        crossover_chrom.get_genes()[1][i] = chromosome1.get_genes()[0][i]
     else:
        crossover_chrom.get_genes()[0][i] = chromosome2.get_genes()[0][i]
        crossover_chrom.get_genes()[1][i] = chromosome2.get_genes()[0][i]
return crossover_chrom

在这部分中,'对于'只运行一次,当它想要更改第五行中的数组值时,退出程序。

错误:

    crossover_chrom.get_genes()[0][i] = chromosome1.get_genes()[0][i]
    TypeError: 'str' object does not support item assignment

3 个答案:

答案 0 :(得分:0)

Python字符串是不可变的。您不能拥有a='10010110'并指定a[3]='1'。这是导致错误的原因。你需要避免字符串。请改用bool数组或integers数组。

类似的东西:

class Chromosome:
  def __init__(self):
    self._genes = [[],[]]
    self._fitness = 0
    self.xd = 0
    self.yd = 0

    xd = random.randint(0,256)
    self._genes[0] = [ int(xd/2**i%2) for i in reversed(range(8))]

    yd = random.randint(0,256)
    self._genes[1] = [ int(yd/2**i%2) for i in reversed(range(8))]

答案 1 :(得分:0)

我可能错了,但看看你提供的内容似乎是

crossover_chrom.get_genes()[0]

返回一个字符串。所以你试图通过索引为字符串分配一个新值,因此错误。 如果分配给一个字符串是你想要的(也就是在第i个位置更改字符串的单个字符),你可以这样做:

crossover_chrom.get_genes()[0] = "{0}{1}{2}".format(
    crossover_chrom.get_genes()[0][:i],
    chromosome1.get_genes()[0][i],
    crossover_chrom.get_genes()[0][i+1:])

或更好的方法是,为了清楚起见,将值分别分配给临时变量,并避免每次都调用get_gene函数:

orig_gene=crossover_chrom.get_genes()[0]
new_gene1=chromosome1.get_genes()[0]
#...
orig_gene = "{0}{1}{2}".format(
        orig_gene[:i],
        new_gene1[i],
        orig_gene[i+1:])

否则你必须将字符串转换为列表(只需在对象上调用list即可:

list(crossover_chrom.get_genes()[0])

或修改get_genes()以返回列表而不是字符串列表。

答案 2 :(得分:0)

在python中解决字符串不变性的一种方法是重建字符串。 这是在某个索引处将字符更改为upercase的示例:

index=3
string="abcdefgh"

string= string[:index]+string[index].upper()+ string[index+1:]
print(string)

这将打印出来:

abcDefgh