将列表排序到另一个列表中

2024-10-02 14:20:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个项目中,我想排序与数据点(克隆)和ID的列表列表到一个不同的列表。需要说明的是,所需的格式是clusters[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文件的结构:

沃比尔德_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
...

沃比尔德_clusterresult.txt文件地址:

846160   1
820434   5
849103   4
...

Tags: 数据intxt列表forlen格式line
1条回答
网友
1楼 · 发布于 2024-10-02 14:20:21

问题出在生成clusters的行上:

clusters = amOfClusters * [['']]

这将创建一个列表,其中amOfClusters引用了相同的子列表。将项添加到任何索引的子列表时,到处都会看到更改:

>>> clusters = [['']] * 4
>>> clusters
[[''], [''], [''], ['']]
>>> clusters[0].append('x')
>>> clusters
[['', 'x'], ['', 'x'], ['', 'x'], ['', 'x']]

为了解决这个问题,你需要为每个索引创建一个新的列表。使用^{}可以很容易地做到这一点:

>>> clusters = [[''] for _ in range(4)]
>>> clusters[0].append('x')
>>> clusters
[['', 'x'], [''], [''], ['']]

如果将代码中的行更改为以下行,则应获得预期的行为:

clusters = [[''] for _ in range(amOfClusters)]

相关问题 更多 >