Python 列表会打印但不会 return
Python list will print but not return
我正在处理获取 csv 文件的代码,然后 returncsv 文件中每一行的数据点列表。列表将按日期和位置排序。
该代码按我想要的方式生成列表,但在调用时不会 return 列表。
第一个函数读取文件并制作数据点。第二个函数调用第一个函数,排序并(希望)returns 数据
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,[])
当我 运行 这段代码时,它会打印我想要的内容(大列表,如果您想知道,我将其粘贴在下面)但是 returns None(noneType 对象)。 为什么 return打印和打印给出两个不同的东西,我该如何解决这个问题?
[[['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'}]]]
您的 compileData
函数有多个执行分支,这意味着它可以 return 在多个点。但是,其中只有 一个 (counter !=0 and counter >= len(sortedData)
即最后一个 else
分支曾经 return 任何东西。
例如:
if counter==0:
sortedData=CreateDataStructure(filename)
compileData(filename,1,sortedData)
即使那个 compileData
调用设法到达最后一个 else
分支,即打印结果并 return 的分支,实际上没有对结果做任何事情。这意味着在 compileData(filename,1,sortedData)
完成后,它 returns 的数据被丢弃,函数继续执行直到它最终到达终点并隐式地 returns 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
我正在处理获取 csv 文件的代码,然后 returncsv 文件中每一行的数据点列表。列表将按日期和位置排序。
该代码按我想要的方式生成列表,但在调用时不会 return 列表。
第一个函数读取文件并制作数据点。第二个函数调用第一个函数,排序并(希望)returns 数据
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,[])
当我 运行 这段代码时,它会打印我想要的内容(大列表,如果您想知道,我将其粘贴在下面)但是 returns None(noneType 对象)。 为什么 return打印和打印给出两个不同的东西,我该如何解决这个问题?
[[['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'}]]]
您的 compileData
函数有多个执行分支,这意味着它可以 return 在多个点。但是,其中只有 一个 (counter !=0 and counter >= len(sortedData)
即最后一个 else
分支曾经 return 任何东西。
例如:
if counter==0:
sortedData=CreateDataStructure(filename)
compileData(filename,1,sortedData)
即使那个 compileData
调用设法到达最后一个 else
分支,即打印结果并 return 的分支,实际上没有对结果做任何事情。这意味着在 compileData(filename,1,sortedData)
完成后,它 returns 的数据被丢弃,函数继续执行直到它最终到达终点并隐式地 returns 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