2012-12-17 39 views
1

因此,假设我在列表A中有200个数值的列表。我想创建一个列表B,它将列表A分成4个簇,所以我会得到50个集群。在列表BI想为4个值的每个集群的列表,所以它会包含在列表B. 50名名单Python,打印一个列表并不给我输出我想

我会用我的源解释我的问题:

from pprint import pprint 

    FileValuelist = [] 

    def DetermineClusterNumber(File):    #determine digits in a cluster 
      Lines = open(File, "r") 
      i = 0 # used for iterating through the lines 
      FirstLine = Lines.readline() 
      for char in FirstLine:     # read through first line, till hyphen. 
        if char != "-": 
          i += 1 
        elif char == "-": 
          return i # Return number of digits in the cluster 

    def ReadLines(File, Cluster_Number): 
      Lines = open(File, "r") 
      for Line in Lines: 
        for char in Line: 
          if char != "-": 
              FileValuelist.append(char) 

    def RemoveNewlines(Rawlist): 
      for x in range(len(FileValuelist)-9): 
        if FileValuelist[x] == "\n": 
          FileValuelist.remove(FileValuelist[x]) 
        if FileValuelist[x] == "\r": 
          FileValuelist.remove(FileValuelist[x]) 


    Cluster_Number = DetermineClusterNumber("Serials.txt") # Amount of chars in a cluster. Example: 1234-2344-2345. clusternumber = 4 
    ReadLines ("Serials.txt", Cluster_Number) 
    RemoveNewlines(FileValuelist) 

    list_iterater = 0 

    FinishedList = ([[None]*(Cluster_Number)])*((len(FileValuelist))) 
    amount_of_clusters = len(FileValuelist)/Cluster_Number 

    for x in range(0, amount_of_clusters): 
      for y in range(0, Cluster_Number): 
        FinishedList[x][y] = FileValuelist[list_iterater] 
        list_iterater += 1 

    pprint(FinishedList) 

随着serials.txt包含:

4758-8345-1970-4486-2348 
    2346-1233-3463-7856-4572 
    6546-6874-1389-9842-4185 
    9896-4688-4689-6455-4712 
    9541-5621-8414-7465-5741 
    4545-9959-5632-6845-1351 
    5643-2435-5854-6754-8749 
    7892-3457-8923-4572-5397 
    5623-5698-5468-5476-9874 
    8762-3487-6123-7861-2679 

当我运行这个,我希望它打印列表中的serials.txt,包含50个分裂50名单。但是当我运行它时,它会打印出[2,6,7,8]五十次。这是最后一个集群。所以我猜这个问题是在位于第39行的地方。 我已经试着在第41行看看分配给FinishedList的值是什么,它每次都是正确的值(所以不是2,6,7,9,就像列表打印出来)。我已经重新检查了x和y迭代器(是的,我知道它是拼写迭代器),它们也是正确的。

那么我的代码中出现了什么问题,使它最后一次打印五十次呢? 我使用Python 2.7的方式,如果你不知道。

在此先感谢!

+3

就像一个笔记:请看看[Python的命名约定](http://www.python.org/dev/peps/pep-0008/#prescriptive-naming-conventions)。你的代码伤害了我的眼睛。 :( – pemistahl

+2

真的,虽然你可以用'with'和'split()'来完成5行代码的整个操作。 –

回答

1

此行是不是做了什么你觉得它在做什么:

FinishedList = ([[None]*(Cluster_Number)])*((len(FileValuelist))) 

它存储参照相同[None, None, None... None]列表,len(FileValuelist)次(*运营商基本上执行浅拷贝)。如果您想确保它创建新的列表,最简单的方法是使用list comprehension

FinishedList = [[None] * Cluster_Number for _ in xrange(len(FileValuelist))] 
0

FinishedList = ([[None]*(Cluster_Number)])*((len(FileValuelist)))上的第二乘法实际上并不创建len(FileValuelist)新列表,只是很多指向原始列表的指针。当你改变他们中的任何一个都会改变。我回过头问the same question,看到那里接受的答案。

0

您初始化FinishedList的方式,您最终会得到一个列表,其中包含对相同子列表的引用。然后,当您去分配[x][y]时,您将覆盖每次都重复引用的相同值。您不需要使用Python初始化列表,因此请在第二个循环中使用append()

for x in range(amount_of_clusters): 
    offset = x * Cluster_Number 
    FinishedList.append(FileValueList[offset:offset + Cluster_Number]) 
0

你为什么要这么复杂?你可以完成你想要的两行代码:

>>> with open('serials.txt') as data: 
... clusters = [[int(digit) for digit in cluster] for line in data for cluster in line.strip().split('-')] 

然后clusters包含:

[ 
    [4, 7, 5, 8], 
    [8, 3, 4, 5], 
    [1, 9, 7, 0], 
    # ... 
] 
+0

我想OP想要一个包含数字的列表,而不是一个嵌套的列表 - 所以使用'extend ''而不是'append'可能会更好(或者像我的答案一样嵌套列表理解)。另外,为什么在这里使用'rb'模式来读取文件? – l4mpi

+0

@ l4mpi对,我纠正了我的答案。 – pemistahl

0

哥们,没有犯罪,但你的代码是可怕的unpythonic - 寻找关于代码风格和几个教程名单。整个问题(如果我理解正确)可以用几行简单的代码来解决。

据我了解,你要打开的文件中的每个四位数值进入其数字的列表,这些数字存储在另一个列表,意为输入

"1234-5678-9999" 

结果应该被

[[1,2,3,4], [5,6,7,8], [9,9,9,9]] 

这是可以实现容易,因为这样的:

with open("serials.txt") as f: 
    clusters = [c for line in f for c in line.strip().split("-")] 
    digits = [list(c) for c in clusters] 

没有位数w包含每个群集的字符列表。如果您需要整数值,您可以将list(c)更改为嵌套列表理解,如[int(x) for x in c]

相关问题