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

时间:2016-05-06 01:04:13

标签: python list sorting

我正在开展一个项目,我想在其中将包含数据点(克隆)和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
...

1 个答案:

答案 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)]