在零和一列中翻转一下

时间:2017-07-19 15:49:48

标签: python list

我有一个随机生成的0和1的列表。我需要选择一个位并将其翻转到相反的位置:从0到1或从1到0。 按位非运算符仅适用于整数和长整数,而xor(^)运算符适用于两个整数。

Enter a population size: 4
Enter an organism length: 2
[[1, 1], [0, 1], [0, 0], [0, 0]]
[[[1, 1], [0, 1]]]

上面的代码是一个简短的用户输入程序的一部分,用户输入弹出的大小和长度。该程序打印一个随机生成的数字列表,其中包括弹出大小和长度,并占据前50%,这是第二个打印列表。现在我需要从第二个列表中选择一个随机位并将其翻转为零或一个。然而,不是整个清单。

非常感谢链接和解释,我希望改进。

2 个答案:

答案 0 :(得分:2)

您可以使用randint为索引生成随机整数,然后使用例如^1来翻转它,例如:

from random import randint

pop = [[1, 1], [0, 1], [0, 0], [0, 0]]
individual = pop[1]                            # select the second individual
individual[randint(0,len(individual)-1)] ^= 1  # flip the bit

我跑了之后,我获得了:

>>> pop
[[1, 1], [0, 0], [0, 0], [0, 0]]

所以它翻了第二位。但它也可能是第一个。通过使用len(individual),我们保证如果个人的位数增加,它仍将有效。

有人说在列表中将比特编码为0-1,效率不高。您可以在Python中使用int作为位列表(int中具有任意长度。)

修改

如果你想翻转 per 个体(对于每个人,它可以是不同的位),你可以使用for循环:< / p>

for individual in pop:                             # iterate over population
    individual[randint(0,len(individual)-1)] ^= 1  # flip a random bit

如果我按照给定的初始人口计算,我得到:

>>> pop
[[0, 1], [1, 1], [0, 1], [1, 0]]

因此每个人都只有一个位翻转,而不是全部相同。当然它是随机的,所以在某次运行中,随机数发生器可能会为每个人选择相同的位。

答案 1 :(得分:1)

要翻转单个位,请使用逻辑参数。

int(not 0) = 1
int(not 1) = 0

如果你必须在每个人群中只翻一点,我建议:

chrom = random.choice(pop)
j = random.randrange(len(chrom))
chrom[j] = int(not chrom[j])