2014-03-03 32 views
0

我試圖修改一個模擬康威的生命遊戲版本的python腳本。其中,X列和Y行中的一組單元格各自被賦予一個值,該值確定它們是否將根據它們的鄰居的狀態在活動或休眠的兩種狀態之間切換。Python:用.txt列表替換random.random

現在,這些單元格的初始值由此定義定義,該定義引用用戶設置的多個變量。 (這個心不是完整的劇本,只是我認爲是相關的)

def randomizeArray(intLength,intWidth): 
    arr = [] 
    for j in range(intWidth): 
     arri = [] 
     for i in range(intLength): 
      rnd =random.random() 
      arri.append(rnd) 

     arr.append(arri) 
     print rnd 
    return arr 

def Main(): 
    intLength = rs.GetInteger("how many in x",30) 
    intWidth = rs.GetInteger("how many in y",30) 
    intGen = rs.GetInteger("how many generations",40) 
    strStack = rs.GetString ("should I stack the generations", "yes", ["yes", "no"]) 
    crvs = rs.GetObjects("select the crvs",4) 
    thres = rs.GetReal("type the threshold to voxelize",1) 
    allValues = [] 
    arrValues = randomizeArray(intLength,intWidth) 
    for i in range(40): 
     arrValues = applyGOL(arrValues) 
    allValues.append(arrValues) 
    #arrMeshes = render(arrValues,-1, strStack) 
    for i in range(intGen-1): 
     arrValues = applyGOLCrvs(arrValues, i, crvs) 
     allValues.append(arrValues) 
     """ 
     if strStack == "no" : 
      update(arrMeshes, arrValues) 
     else : 
      render(arrValues,i, strStack) 
     """ 
    myVoxels = voxels(intLength,intWidth,intGen, allValues) 
    myVoxels.voxelize(thres) 
    #Call DeleteObjects2dArray(arrMeshes) 

Main() 

我想要做的是,我可以給自己設定值的.txt文件替換random.random功能。

這就是我來了這麼遠

def selectedArray(intLength,intWidth): 
    arr = [] 
    for j in range(intWidth): 
     arri = [] 
     for i in range(intLength): 
      selected = open('C:\Users\IAmADog\Documents\Thesis\Scripts\ArrayValues2.txt','r') 
      lines = selected.read().split(',') 
      arri.append(lines) 
     arr.append(arri) 
    return arr 

但是,當這種運行它給了我一個錯誤說「消息:不支持的操作數類型(S)爲+:‘詮釋’和'名單'」

.txt文件設置這樣[.1 .1 .9 .9 ....等]

上爲什麼會發生什麼建議嗎? 完整的代碼可以在這裏找到。 https://stackoverflow.com/questions/22138217/assistance-with-python-gol-script

+0

可能重複(http://stackoverflow.com/questions/22138217/assistance-with-python-gol-script) – 2rs2ts

+0

你能發佈一個.txt文件的例子嗎? (是多行,還是單行顯示)。你用手創造它嗎?爲什麼有[]在裏面? – bj0

+0

它被格式化爲範圍從0到1的數字列表。每個數字後面都有一個逗號。文件中沒有括號。它看起來像這樣:「.1,1,1,1,1,.9,.9,.9,.9,.9,.1,.1,.1,.1,.1, .9,.9,.9,.9,.9,.1,.1,.1,.1,.1,.9,.9,.9,.9,.9「 – HelloThisIsDog

回答

0

首先,你絕對不想打開你的文本文件裏面的你的循環。在開始循環之前,打開文本文件並將數據讀入變量。其次,它看起來並不像您所發佈的代碼部分中的錯誤,但可能是由於沒有正確解析文件中的數據。當你應該附加一個單一的號碼時,你是一個完整的項目清單。

如果該文件只是一行逗號分隔值(在末尾帶有[]],那麼您需要剝離[],在逗號分隔(如您所做的那樣),並將每個字符串轉換爲浮動。然後,您需要一次添加一個項目,而不是一次添加所有項目。

+0

我會給這是一個嘗試。謝謝。 – HelloThisIsDog

+0

更好的是,使用'with' /'as'構造。 '打開('myfile','r')作爲文件:' – 2rs2ts

1

您對文本文件格式的描述相當粗略,因此我將假定每行都用開始和結束方括號表示,並且各個值之間用逗號分隔,並且逗號與可選空格分隔。這意味着第一個字符和最後兩個字符(還有一個換行符)應該被忽略。我的文件是這樣的:

[1, 3, 5, 7, 9] 
[3, 5, 7, 9, 11] 
[5, 7, 9, 11, 13] 

下面的代碼根據文件的大小,而不是使用設定值產生一個數組,但希望這將讓你對你的方式。

def selectedArray(intLength,intWidth): 
    arr = [] 
    selected = open('ArrayValues2.txt','r') 
    for line in selected: 
     values = [float(f.strip()) for f in line[1:-2].split(',')] 
     arr.append(values) 
    return arr 

for row in selectedArray(3, 5): 
    print(row) 

的輸出是[使用Python腳本GOL輔助]

[1.0, 3.0, 5.0, 7.0, 9.0] 
[3.0, 5.0, 7.0, 9.0, 11.0] 
[5.0, 7.0, 9.0, 11.0, 13.0]