2012-12-17 63 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]

相關問題