Python 我能';t将单个元素附加到嵌套列表
我正在尝试向嵌套列表中的列表添加元素。但是,元素会添加到嵌套列表中的每个列表中,而不仅仅是它要进入的列表。我尝试过使用同一段代码,它在我的程序之外工作得非常好,所以我将在这里添加我的整个程序。我为自己的糟糕形式和效率低下道歉,但我对编码还是比较陌生的。谢谢Python 我能';t将单个元素附加到嵌套列表,python,list,nested,Python,List,Nested,我正在尝试向嵌套列表中的列表添加元素。但是,元素会添加到嵌套列表中的每个列表中,而不仅仅是它要进入的列表。我尝试过使用同一段代码,它在我的程序之外工作得非常好,所以我将在这里添加我的整个程序。我为自己的糟糕形式和效率低下道歉,但我对编码还是比较陌生的。谢谢 import pygame import sys from random import randint import math pygame.init() black = 0,0,0 white = 255,255,255 red = 255
import pygame
import sys
from random import randint
import math
pygame.init()
black = 0,0,0
white = 255,255,255
red = 255,0,0
blue = 0,0,255
screen = pygame.display.set_mode((500,500))
screen.fill(white)
citiesX = []
citiesY = []
visits = []
paths = []
lengths = []
cities = []
list1 = []
#Sets the colour of the line depending on its length
def getColour(CurrentLength):
percentage = (CurrentLength/1400)*100
colour = 2.55*percentage
return(colour)
#Renders Lines
def drawLines(visits):
global citiesX
global citiesY
screen.fill(white)
pygame.draw.circle(screen, red, (citiesX[0],citiesY[0]), 5, 4)
#Draw Cities
for i in range (1,len(citiesX)):
pygame.draw.circle(screen, black, (citiesX[i],citiesY[i]), 5, 4)
#Draw Paths
for i in range (0,len(visits)-1):
#Colour Rendering
lengthX = (citiesX[visits[i]]-citiesX[visits[i+1]])*(citiesX[visits[i]]-citiesX[visits[i+1]])
lengthY = (citiesY[visits[i]]-citiesY[visits[i+1]])*(citiesY[visits[i]]-citiesY[visits[i+1]])
CurrentLength = math.sqrt(lengthX+lengthY)
#Draw Lines
pygame.draw.lines(screen, (getColour(CurrentLength),getColour(CurrentLength),getColour(CurrentLength)), False, [(citiesX[visits[i]],citiesY[visits[i]]),(citiesX[visits[i+1]],citiesY[visits[i+1]])], 4)
pygame.display.update()
#Find out how long a generated path is
def getPathLength(visits):
totalLength = 0
for i in range (0,len(visits)-1):
lengthX = (citiesX[visits[i]]-citiesX[visits[i+1]])*(citiesX[visits[i]]-citiesX[visits[i+1]])
lengthY = (citiesY[visits[i]]-citiesY[visits[i+1]])*(citiesY[visits[i]]-citiesY[visits[i+1]])
CurrentLength = math.sqrt(lengthX+lengthY)
pygame.draw.lines(screen, (getColour(CurrentLength),getColour(CurrentLength),getColour(CurrentLength)), False, [(citiesX[visits[i]],citiesY[visits[i]]),(citiesX[visits[i+1]],citiesY[visits[i+1]])], 4)
pygame.display.update()
totalLength +=CurrentLength
return(totalLength)
#Evolve the paths
def evolve(gen):
global paths
global lengths
global citiesX
global visits
global cities
global list1
for i in range (0,100):
visits = []
visits.append(0)
#for i in range (1,count):
# visits.append(gen[i])
x = 0
while len(visits)<len(citiesX):
num = list1[x][randint(0,len(citiesX)-1)]
while (num in visits):
num = list1[x][randint(0,len(citiesX)-1)]
visits.append(num)
x = x+1
paths.append(visits)
lengths.append(getPathLength(visits))
genPicker = sorted(lengths)
gen = paths[lengths.index(genPicker[0])]
bad = paths[lengths.index(genPicker[99])]
print(gen)
drawLines(gen)
gen.remove(0)
bad.remove(0)
#THIS IS WHERE THE ISSUE IS!!!!!!!
for i in gen:
list1[gen.index(i)].append(i)
print(list1)
paths = []
lengths = []
#count = count+1
evolve(gen)
#Randomly Generates the cities
for i in range (0,10):
citiesX.append(randint(0,500))
citiesY.append(randint(0,500))
#lists used for evolution
for x in range(0,len(citiesX)):
cities.append(x)
print("Cities: ",cities)
for i in range(0,len(cities)-1):
list1.append(cities)
print(list1)
#Draws the cities
pygame.draw.circle(screen, red, (citiesX[0],citiesY[0]), 5, 4)
for i in range (1,len(citiesX)):
pygame.draw.circle(screen, black, (citiesX[i],citiesY[i]), 5, 4)
#Creates First Generation
for i in range (0,100):
visits.clear()
visits.append(0)
while len(visits)<len(citiesX):
num = cities[randint(0,len(citiesX)-1)]
while num in visits:
num = cities[randint(0,len(citiesX)-1)]
visits.append(num)
paths.append(visits)
lengths.append(getPathLength(visits))
#Gets the best path from the first generation
genPicker = sorted(lengths)
#Stores Gen1
gen1 = paths[lengths.index(genPicker[0])]
print(gen1)
#Draws Gens1
drawLines(gen1)
#resets varaibles
paths = []
lengths = []
count = 1
#The program evolves the path
evolve(gen1)
导入pygame
导入系统
从随机导入randint
输入数学
pygame.init()
黑色=0,0,0
白色=255255
红色=255,0,0
蓝色=0,0255
screen=pygame.display.set_模式((500500))
屏幕填充(白色)
Citiex=[]
citiesY=[]
访问量=[]
路径=[]
长度=[]
城市=[]
列表1=[]
#根据线条的长度设置线条的颜色
def GetColor(当前长度):
百分比=(当前长度/1400)*100
颜色=2.55*百分比
退货(彩色)
#渲染线条
def抽绳(检查):
全球花旗
全球城市
屏幕填充(白色)
pygame.draw.circle(屏幕,红色,(citiesX[0],citiesY[0]),5,4)
#画城市
对于范围(1,len(citiesX))中的i:
pygame.draw.circle(屏幕,黑色,(citiesX[i],citiesY[i]),5,4)
#画路径
对于范围内的i(0,len(访问)-1):
#显色
长度=(citiesX[访问[i]]-citiesX[访问[i+1]])*(citiesX[访问[i]]-citiesX[访问[i+1]])
冗长=(citiesY[访问[i]]-citiesY[访问[i+1]])*(citiesY[访问[i]]-citiesY[访问[i+1]])
CurrentLength=math.sqrt(长度x+Length)
#划线
pygame.draw.lines(屏幕,(GetColor(CurrentLength)、GetColor(CurrentLength)、GetColor(CurrentLength))、False、[(citiesX[访问[i]]、citiesY[访问[i]]、(citiesX[访问[i+1]]、citiesY[访问[i+1]])、4)
pygame.display.update()
#了解生成的路径有多长
def getPathLength(访问次数):
总长度=0
对于范围内的i(0,len(访问)-1):
长度=(citiesX[访问[i]]-citiesX[访问[i+1]])*(citiesX[访问[i]]-citiesX[访问[i+1]])
冗长=(citiesY[访问[i]]-citiesY[访问[i+1]])*(citiesY[访问[i]]-citiesY[访问[i+1]])
CurrentLength=math.sqrt(长度x+Length)
pygame.draw.lines(屏幕,(GetColor(CurrentLength)、GetColor(CurrentLength)、GetColor(CurrentLength))、False、[(citiesX[访问[i]]、citiesY[访问[i]]、(citiesX[访问[i+1]]、citiesY[访问[i+1]])、4)
pygame.display.update()
总长度+=当前长度
返回(总长度)
#发展道路
def(发电机):
全局路径
全局长度
全球花旗
全球访问
全球城市
全球清单1
对于范围(0100)内的i:
访问量=[]
访问。附加(0)
#对于范围内的i(1,计数):
#访问。附加(gen[i])
x=0
而len(访问)
问题在于如何创建list1
。列表1仅包含相同对象20次左右
创建时:
for i in range(0,len(cities)-1):
list1.append(cities)
您只是将相同的列表放入list1
。另一方面,这会附加一个克隆:
for i in range(0,len(cities)-1):
list1.append(cities[:]) # note the :.
问题在于如何创建list1
。列表1仅包含相同对象20次左右
创建时:
for i in range(0,len(cities)-1):
list1.append(cities)
您只是将相同的列表放入list1
。另一方面,这会附加一个克隆:
for i in range(0,len(cities)-1):
list1.append(cities[:]) # note the :.
这是很多代码!你能把它缩短到一个吗?也许把这个部分去掉,然后再包含完整的代码?你能把你的代码简化并添加更多的解释吗?代码太多了!你能把它缩短到一个吗?也许把这个部分去掉,然后把完整的代码放在后面?你能把你的代码减到最少,再加上更多的解释吗?