2017-02-14 16 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). Почему возвращение и печать дают две разные вещи, и как я могу исправить это?

[[['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()'). В некоторых случаях ваши операторы if не имеют возвратного значения. –

+0

Я бы предположил, что вы также захотите поменять строки 'bigList = []' и 'для ключа, locationGroup ...'. Кроме того, вам может понадобиться возврат перед каждым вызовом 'compileData'. И последнее, но не менее важное: Пожалуйста, проверьте форматирование кода перед публикацией. – nitzel

+0

Я бы посоветовал использовать 'pandas' для этого,' pandas.read_csv' будет читать в csv-файле, и вы можете сделать 'groupby' довольно легко - я не совсем уверен, что такое отображение из csv в желаемый выходной список, хотя –

ответ

0

Ваша compileData функция имеет несколько ветвей исполнения, то есть он может вернуться в нескольких точках. Однако, только один из них (counter !=0 and counter >= len(sortedData) т.е. последней else ветви когда-либо возвращает ничего

. Например:

if counter==0: 
    sortedData=CreateDataStructure(filename) 
    compileData(filename,1,sortedData) 

даже если вызов, который compileData удается достичь последнего else ветви, то есть один который печатает и возвращает результат, ничего не происходит с результатом. Это означает, что после завершения 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 

Update

Вы могли бы сделать вашу функцию (субъективно) немного легче для понимания 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

Вы видите какие-либо другие проблемы? –