我正在开展一个项目,我想在其中将包含数据点(克隆)和ID的列表列表排序到不同的列表中。需要说明的是,所需的格式是集群[id,data []]。数据是包含8个数据点的列表。我现在拥有列表的格式是clusterData [clusterId,...],以及id和#和clusterResultData [cloneId,clusterId]等集群的列表。
排序过程如下:
for i in range(len(clusterResultData)):
clusterId = int(clusterResultData[i][1])
clusters[clusterId].append(clusterData[i])
这是一个包含格式簇的列表[clusterId,data [cloneId,...]。 但是,每个'集群'填充了所有~1000个数据点,而点应该在簇上进行划分。
如果有帮助,这里是完整的代码:
clusterResultData = []
clusterData = []
clusterIdList = []
with open("Voorbeeld_clusterresult.txt", "r") as resultFile:
i = 0
for line in resultFile: #doorloopt alle regels in het bestand
if len(line) != 0:
clusterResultData.append(line.split()) #maakt een list met [cloneId, clusterId] voor elke clone
clusterIdList.append(clusterResultData[i][1])
i += 1
amOfClusters = len(set(clusterIdList)) #aantal unieke clusterIds
clusters = amOfClusters * [['']]
with open("Voorbeeld_clusterdata.txt", "r") as resultFile:
i = 0
for line in resultFile:
if len(line) != 0:
clusterData.append(line.split()) #maakt een list met [cloneId, clusterId] voor elke clone
#print clusterData[i], clusterResultData[i]
i += 1
for i in range(len(clusterResultData)):
clusterId = int(clusterResultData[i][1])
clusters[clusterId].append(clusterData[i])
for i in range(amOfClusters):
print i, clusters[i][1] #test, every cluster is exactly identical
这些是带有数据的两个txt文件的结构:
Voorbeeld_clusterdata.txt:
846160 0.388 0.329 0.69 0.9 0.626 0.621 0.399 0.37
820434 -0.296 -0.503 -0.454 -0.868 -0.721 -0.918 -0.486 -0.582
849103 -0.246 -0.935 -0.277 -0.175 -0.278 -0.075 -0.236 -0.417
...
Voorbeeld_clusterresult.txt:
846160 1
820434 5
849103 4
...
答案 0 :(得分:0)
问题在于您生成clusters
的行:
clusters = amOfClusters * [['']]
这将创建一个列表,其中包含对{strong>相同子列表的amOfClusters
个引用。当您将项目添加到任何索引中的子列表时,您会在任何地方看到更改:
>>> clusters = [['']] * 4
>>> clusters
[[''], [''], [''], ['']]
>>> clusters[0].append('x')
>>> clusters
[['', 'x'], ['', 'x'], ['', 'x'], ['', 'x']]
为了解决这个问题,您需要为每个索引创建一个新列表。您可以使用list comprehension
轻松完成:
>>> clusters = [[''] for _ in range(4)]
>>> clusters[0].append('x')
>>> clusters
[['', 'x'], [''], [''], ['']]
如果您将代码更改为以下行,则应该获得预期的行为:
clusters = [[''] for _ in range(amOfClusters)]