2017-02-14 25 views
-1

私はcsvファイルを受け取ってから、csvファイルのすべての行についてデータポイントのリストを返します。リストは日付と場所によってソートされます。Pythonリストが出力されますが、返されません。

コードはリストをどのようにしたいのですが、呼び出されたときにリストを返しません。

最初の関数はファイルを読み取り、データポイントを作成します。第二の機能はまず、並べ替えを呼び出して、私はこのコードを実行すると(たぶん)

def CreateDataStructure(data): 
allData=[] 
with open(data,'r') as data: 

    dataRead=data.readlines() 
    for line in dataRead[1:]: 
     splitList=line.split(",") 
     dataPoint =[splitList[25],splitList[1],{splitList[19]:splitList[9]}] 
     allData.append(dataPoint) 
sortedData=sorted(allData) 
return sortedData 


def compileData(filename,counter,sortedData):  
    if counter==0: 
     sortedData=CreateDataStructure(filename) 
     compileData(filename,1,sortedData) 
    else: 
     if counter<len(sortedData): 

      if sortedData[0][0]==sortedData[1][0] and sortedData[0][1]==sortedData[1][1]:#change these back 
       compDict=dict(list(sortedData[0][2].items())+list(sortedData[1][2].items())) 
       sortedData[0]=[sortedData[0][0],sortedData[0][1],compDict]  
       sortedData.pop(1) 
       compileData(filename,counter,sortedData) 
       counter=counter+1 
      else: 
       sortedData+=[sortedData.pop(0)] 
       counter=counter+1 
       compileData(filename,counter,sortedData) 
     else: 
      from itertools import groupby 
      for key, locationGroup in groupby(sortedData, lambda x: x[0]): 
       bigList=[] 
       smallList=[] 
        for date in locationGroup: 
        smallList.append(date) 
        bigList.append(smallList) 
      print bigList 
      return bigList 

print compileData("fakeData.csv",0,[]) 

データを返し、それは(私は(私はあなたが思っている場合には、以下の貼り付けBIGLIST、)何をしたい出力しますが、Noneを返しますnoneTypeオブジェクト)。 返品と印刷はなぜ2つの異なるものになるのですか?これをどのように修正できますか

[[['744701', '40974', {'Alkalinity': '234'}], ['744701', '41018', {'Alkalinity': '252'}], ['744701', '41058', {'Alkalinity': '270.53'}]], [['744701', '40974', {'Alkalinity': '234'}], ['744701', '41018', {'Alkalinity': '252'}], ['744701', '41058', {'Alkalinity': '270.53'}]], [['744701', '40974', {'Alkalinity': '234'}], ['744701', '41018', {'Alkalinity': '252'}], ['744701', '41058', {'Alkalinity': '270.53'}]]]

+2

そのコード( 'compileData()')では1つのreturn文しか使用していません。 if文には戻り値がないことがあります。 –

+0

私は 'bigList = []'と 'for key、locationGroup ...'という行を入れ替えたいと思うでしょう。 また、 'compileData'へのすべての呼び出しの前にリターンが必要です。 最後に重要なことですが、投稿する前にコードの書式を確認してください。 – nitzel

+0

私は 'pandas'を使ってこの種の作業をすることを推奨します。' pandas.read_csv'はcsvファイルで読み込まれ、 'groupby'sをかなり簡単に行うことができます。希望の出力リストへのCSVは –

答えて

0

あなたcompileData機能は、複数のポイントで返すことができることを意味し、実行の複数のブランチを持っています。しかし、最後のelse枝すなわちだけ1それらのcounter !=0 and counter >= len(sortedData)は今まで何を返し例えば

:。

その compileDataコールが1、つまり、最後の else枝に到達するために管理していても
if counter==0: 
    sortedData=CreateDataStructure(filename) 
    compileData(filename,1,sortedData) 

compileData(filename,1,sortedData)が終了した後に返されるデータは破棄され、最終的に最後に到達するまで関数の実行が継続され、暗黙的にNoneが返されます。

この結果、実際には結果は出力されません。

これは問題というを修正する必要があります。

def compileData(filename,counter,sortedData):  
    if counter==0: 
     sortedData=CreateDataStructure(filename) 
     return compileData(filename,1,sortedData) 
    else: 
     if counter<len(sortedData): 

      if sortedData[0][0]==sortedData[1][0] and sortedData[0][1]==sortedData[1][1]:#change these back 
       compDict=dict(list(sortedData[0][2].items())+list(sortedData[1][2].items())) 
       sortedData[0]=[sortedData[0][0],sortedData[0][1],compDict]  
       sortedData.pop(1) 
       counter=counter+1 
       return compileData(filename,counter,sortedData) 
      else: 
       sortedData+=[sortedData.pop(0)] 
       counter=counter+1 
       return compileData(filename,counter,sortedData) 
     else: 
      from itertools import groupby 
      for key, locationGroup in groupby(sortedData, lambda x: x[0]): 
       bigList=[] 
       smallList=[] 
        for date in locationGroup: 
        smallList.append(date) 
        bigList.append(smallList) 
      print bigList 
      return bigList 

更新

あなたはreturning early代わりの入れ子いくつかのifsによって理解することが少し簡単(主観的に)あなたの関数を作ることができます。あなたの関数は、次のようになります。

from itertools import groupby 
... 
def compileData(filename,counter,sortedData): 
    if counter==0: 
     sortedData=CreateDataStructure(filename) 
     return compileData(filename,1,sortedData) 

    if counter<len(sortedData): 
     if sortedData[0][0]==sortedData[1][0] and sortedData[0][1]==sortedData[1][1]:#change these back 
      compDict=dict(list(sortedData[0][2].items())+list(sortedData[1][2].items())) 
      sortedData[0]=[sortedData[0][0],sortedData[0][1],compDict]  
      sortedData.pop(1) 
      counter=counter+1 
      return compileData(filename,counter,sortedData) 

     sortedData+=[sortedData.pop(0)] 
     counter=counter+1 
     return compileData(filename,counter,sortedData) 

    for key, locationGroup in groupby(sortedData, lambda x: x[0]): 
     bigList=[] 
     smallList=[] 
      for date in locationGroup: 
      smallList.append(date) 
      bigList.append(smallList) 

    print bigList 
    return bigList 
+0

ですが、これはうまくいきました!どうもありがとうございます! –

+0

他の問題はありますか? –

関連する問題