簡體   English   中英

將字符串元素中的1s翻轉為0,反之亦然

[英]Flip 1s to 0s and viceversa in string elements

我正在編寫一個簡單的遺傳算法,並且變異運算符要求我以一定的概率隨機翻轉“基因”(即字符串中的單個字符)。

這是我需要隨機翻轉每個字符的列表的一個示例:

a = ['0010010', '0011101', '1101101', '0100110', '1010100', '1000111', '1001110', '0010011', '0011111', '0001001', '0101000', '1010010', '1110000', '0000001', '1100111', '1001100', '1000001', '1001010']

我遍歷列表中每個元素中的每個字符以檢查是否必須像這樣翻轉它:

for elem in a:
    for char in elem:
        r = random.random()
        if r<prob:
            # Flip the char.
            f_char = 1-int(char)
            # Replace the new flipped char in the element?

(其中prob是固定浮點[0,1]

我不確定在必須的情況下如何使用新的翻轉字符更新elem 我還需要此過程盡可能快地運行,因為我的實際列表有些大。

兩種選擇:

一種,您可以使用整數列表而不是字符串。 然后,將它們原位變異:

a = [[0, 0, 1, 0, 0, 1, 0], [0, 0, 1, 1, 1, 0, 1]]
for elem in a:
    for i, bit in enumerate(elem):
        r = random.random()
        if r < prob:
            elem[i] = 1 - bit

第二,您仍然可以使用字符串,但是每次您要更改其中一個字符時,都必須替換整個字符串,因為Python字符串是不可變的。 最好的方法是使用生成器理解,如inspectorG4dget的答案:

a = ['0010010', '0011101']
for i, elem in enumerate(a):
    a[i] = ''.join(str(1 - int(char)) if random.random() < prob else char
                   for char in elem)

字符串是不可變的,因此,即使對染色體中的一個基因進行突變,也必須替換染色體列表中的整個染色體。 所以試試這個:

for i,elem in enumerate(a):
    a[i] = ''.join(char if random.random()>prob else str(1-int(char)) for char in elem)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM