我正在尝试实现功能。它的工作方式应该是这样的:

它需要两个列表。

标记一些索引,最好居中。

父母双方都切换标记索引。

其他索引按顺序转到其父元素。

如果该父元素中已经存在相同的元素,则它将映射并检查同一元素在其他父元素的位置并到达那里。import random

def pm(indA, indB):

size = min(len(indA), len(indB))

c1, c2 = [0] * size, [0] * size

# Initialize the position of each indices in the individuals

for i in range(1,size):

c1[indA[i]] = i

c2[indB[i]] = i

crosspoint1 = random.randint(0, size)

crosspoint2 = random.randint(0, size - 1)

if crosspoint2 >= crosspoint1:

crosspoint2 += 1

else: # Swap the two cx points

crosspoint1, crosspointt2 = crosspoint2, crosspoint1

for i in range(crosspoint1, crosspoint2):

# Keep track of the selected values

temp1 = indA[i]

temp2 = indB[i]

# Swap the matched value

indA[i], indA[c1[temp2]] = temp2, temp1

indB[i], indB[c2[temp1]] = temp1, temp2

# Position bookkeeping

c1[temp1], c1[temp2] = c1[temp2], c1[temp1]

c2[temp1], c2[temp2] = c2[temp2], c2[temp1]

return indA, indB

a,b = pm([3, 4, 8, 2, 7, 1, 6, 5],[4, 2, 5, 1, 6, 8, 3, 7])

错误:

in pm

c1[indA[i]] = i

IndexError: list assignment index out of range

最佳答案

不知道您的代码中是否还有其他错误(我没有运行它),但这是对此的解释。在Python(与其他大多数语言一样)中,列表(更精确的序列)索引基于0:>>> l = [1, 2, 3, 4, 5, 6]

>>>

>>> for e in l:

... print(e, l.index(e))

...

1 0

2 1

3 2

4 3

5 4

6 5

>>>

>>> l[0]

1

>>> l[5]

6

>>> l[6]

Traceback (most recent call last):

File "", line 1, in

IndexError: list index out of range

总结您的问题:

您的indA和indB列表各有6个元素([1..6])及其索引:[0..5]

您的c1和c2列表也有6个元素(索引也为[0..5])

但是,您使用的是#1中的值。作为#2列表中的索引,而值6是一个问题,因为没有这样的索引

要解决您的问题,您应该使用有效的索引值。要么:

在indA和indB中有适当的值(这是我选择的值):

a, b = pmxCrossover([0, 3, 1, 2, 5, 4], [4, 0, 2, 3, 5, 1])

减去1,无论遇到indA或indB用作索引的值:

c1[indA[i] - 1] = i

作为一般建议:每当遇到错误时,请在出现故障的行之前添加打印语句(从中打印(部分)内容),这可能会为您提供线索,从而可以自己解决问题。

@ EDIT0

发布原始代码(略有修改的版本),并进行索引转换:

在算法之前:(从每个元素中减去1)具有有效索引

在算法之后:加1返回基于1的索引

code00.py:

#!/usr/bin/env python3

import sys

import random

def pmx_crossover(ind_a, ind_b):

size = min(len(ind_a), len(ind_b))

c1, c2 = [0] * size, [0] * size

# Initialize the position of each indices in the individuals

for i in range(1, size):

c1[ind_a[i]] = i

c2[ind_b[i]] = i

# Choose crossover points

crosspoint1 = random.randint(0, size)

crosspoint2 = random.randint(0, size - 1)

if crosspoint2 >= crosspoint1:

crosspoint2 += 1

else: # Swap the two cx points

crosspoint1, crosspointt2 = crosspoint2, crosspoint1

# Apply crossover between cx points

for i in range(crosspoint1, crosspoint2):

# Keep track of the selected values

temp1 = ind_a[i]

temp2 = ind_b[i]

# Swap the matched value

ind_a[i], ind_a[c1[temp2]] = temp2, temp1

ind_b[i], ind_b[c2[temp1]] = temp1, temp2

# Position bookkeeping

c1[temp1], c1[temp2] = c1[temp2], c1[temp1]

c2[temp1], c2[temp2] = c2[temp2], c2[temp1]

return ind_a, ind_b

def main():

#initial_a, initial_b = [1, 2, 3, 4, 5, 6, 7, 8], [3, 7, 5, 1, 6, 8, 2, 4]

initial_a, initial_b = [1, 4, 2, 3, 6, 5], [5, 1, 3, 4, 6, 2]

index_offset = 1

temp_a = [i - index_offset for i in initial_a]

temp_b = [i - index_offset for i in initial_b]

a, b = pmx_crossover(temp_a, temp_b)

final_a = [i + index_offset for i in a]

final_b = [i + index_offset for i in b]

print("Initial: {0:}, {1:}".format(initial_a, initial_b))

print("Final: {0:}, {1:}".format(final_a, final_b))

if __name__ == "__main__":

print("Python {0:s} {1:d}bit on {2:s}\n".format(" ".join(item.strip() for item in sys.version.split("\n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform))

main()

print("\nDone.")

输出(一种可能性(由于random.randint)):

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q058424002]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" code00.py

Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] 64bit on win32

Initial: [1, 4, 2, 3, 6, 5], [5, 1, 3, 4, 6, 2]

Final: [1, 3, 2, 4, 6, 5], [5, 1, 4, 3, 6, 2]

Done.

python列表索引超出范围 等于啥_python - IndexError:列表分配索引超出范围,Python相关推荐

  1. python列表索引超出范围 等于啥_python如何解决IndexError:列表索引超出范围?-问答-阿里云开发者社区-阿里云...

    我正在尝试为ucf101数据集生成密集流,但我不断收到以下错误: 我尝试在第68行中将video_name.split('')[1]更改为video_name.split('')[0],已编译代码,但 ...

  2. python读取序列5之后的数据_Python核心编程读笔 5: python的序列

    第六章 序列:字符串.列表.元组 一.序列 (1)序列类型操作符 seq[ind] 获得下标为 ind 的元素 seq[ind1:ind2] 切片操作 seq * expr 序列重复 expr 次 s ...

  3. python数据表元素不为空值_python 填充空值失败_怎么用 Python 做数据分析实例

    01 生成数据表 第一部分是生成数据表,常见的生成方法有两种,第一种是导入外部数据,第二种是直接写入数据. Excel 中的文件菜单中提供了获取外部数据的功能,支持数据库和文本文件和页面的多种数据源导 ...

  4. 非索引查询如何提高效率_Python数据分析:数据库索引如何提高效率?

    - 点击上方"中国统计网"订阅我吧!- 索引在数据库中是一个很特殊的存在,它的目的就是为了提高数据查询得效率.同样,它也有弊端,更新一个带索引的表的时间比更新一个没有带索引的时间更 ...

  5. python语言的三个主要特点_python干货|新总结的4个python语言的特点,这几个细节值得关注...

    [摘要]在这个科学技术高速发展的时代,越来越多的人都开始选择学习编程软件,那么首先被大家选择的编程软件就是python,也用在各行各业之中,并被大家所熟知,所以也有越来越多的python学习者关注py ...

  6. python的缩进规则是什么意思_Python编程思想(2):Python主要特性、命名规则与代码缩进...

    目录 那么什么是动态语言呢? 那么什么是弱类型语言和强类型语言呢? Python命名规则 缩进原则 李宁老师的<Python编程思想>上线了,囊括了Python的核心技术,以及Python ...

  7. python好用的内置库_Python开发哪些库好?老男孩Python学习班

    近年来,伴随着人工智能时代的到来,也促使Python编程语言发展,因此Python成为公认的人工智能编程语言.之所以Python受欢迎,得益于其内置大量的库,那么Python开发有哪些基本库呢?这六大 ...

  8. python列表索引超出范围 等于啥_Python列表错误,列表索引超出范围

    如果我输入1234,那么Values包含字符串"1234".在 然后将字符串转换为整数ValueList=int(Values) # converts string "1 ...

  9. python列表索引超出范围 等于啥_python中的“列表索引超出范围”

    我有一个python代码来索引包含阿拉伯语单词的文本文件.我在一个英文文本上测试了代码,它运行得很好,但是当我测试阿拉伯语时,它给了我一个错误. 注意:文本文件以unicode编码保存,而不是ANSI ...

最新文章

  1. idea自动捕获_Smilefie:如何通过检测微笑来自动捕获自拍
  2. C++中的内存管理(new、delete、内存泄漏)
  3. 哪些类继承了Collection接口
  4. 最困难的是带着自己的选择生活下去
  5. 重磅!阿里发布全新操作系统,成功顶住多年双 11,这次要干翻 CentOS 了!
  6. ZwQuerySystemInformation 枚举驱动模块
  7. Windows tablet数位板数位屏开发出现的问题
  8. matlab 整数规划 非线性,非线性整数规划matlab
  9. c#通讯西门子plc
  10. 在scrapy爬虫框架xpath中extract()方法的使用
  11. 录屏直播时,只有部分屏幕的解决办法
  12. pyspark 解决数据倾斜demo(两端聚合)(全网之最)
  13. 资深研发转变为架构师意味着什么
  14. win7系统盘瘦身四大招:
  15. Virtuoso: 最全安装(IC618,IC617等), 问题解决
  16. Pytorch-gpu版安装教程【注意:无需提前安装cuda和cudnn】
  17. 互联网让中国零售业弯道超车:近创新比黑科技重要
  18. Linux必学的60个命令(文字整理版)
  19. 正则表达式的语法规则
  20. CSS div内文字溢出部分隐藏显示...省略号

热门文章

  1. 拔河原理html,大班活动拔河活动教案
  2. reactor多线程模型_网络编程模型的演进之路
  3. java 堆内存不释放_Java可以写入/读取已释放的堆内存吗?
  4. Java并发包常见异常_Java并发包1--线程的状态及常用方法
  5. 深度学习之基于CNN实现天气识别
  6. How far away ?(dfs水题)
  7. BLE简介和Android BLE编程
  8. 灯泡四个闪烁c语言程序设计教程课后答案,c语言编程题及答案4.doc
  9. 可汉学院python_可汗学院离线版本
  10. 深度学习之循环神经网络(9)LSTM层使用方法