Python 为什么我的代码不能得到预期的回报?
但它返回为[]Python 为什么我的代码不能得到预期的回报?,python,Python,但它返回为[] 我不知道发生了什么事。需要帮助。尝试以下方法: [['Ben Anderson',95,90,100],['Mary Johnson',75,78,79],['Michael Walter',80,68,0]] 输出: 试着这样做: [['Ben Anderson',95,90,100],['Mary Johnson',75,78,79],['Michael Walter',80,68,0]] 输出: 我认为在这里可能非常适用: [['Ben Anderson', 95, 9
我不知道发生了什么事。需要帮助。尝试以下方法:
[['Ben Anderson',95,90,100],['Mary Johnson',75,78,79],['Michael Walter',80,68,0]]
输出:
试着这样做:
[['Ben Anderson',95,90,100],['Mary Johnson',75,78,79],['Michael Walter',80,68,0]]
输出:
我认为在这里可能非常适用:
[['Ben Anderson', 95, 90, 100], ['Mary Johnson', 75, 78, 79], ['Michael Walter', 80, 68, 0]]
这是通过创建一个函数键来实现的,该函数键在列表项应该用作分隔符时返回True,在不应该用作分隔符时返回False。通过在itertools.groupby中使用此函数,我们可以创建所有组,然后我们只需要从生成的iterable中过滤掉所有分隔符值。我认为在这里可能非常适用:
[['Ben Anderson', 95, 90, 100], ['Mary Johnson', 75, 78, 79], ['Michael Walter', 80, 68, 0]]
这是通过创建一个函数键来实现的,该函数键在列表项应该用作分隔符时返回True,在不应该用作分隔符时返回False。通过在itertools.groupby中使用此函数,我们可以创建所有组,然后我们只需要从生成的iterable中筛选出所有分隔符值。具有相同输入和输出形式的建议:
>>> convert_grades(['Ben Anderson',95,90,100,-1,'Mary Johnson',75,78,79,-5,'Michael Walter',80,68,0])
[['Ben Anderson', 95, 90, 100], ['Mary Johnson', 75, 78, 79], ['Michael Walter', 80, 68, 0]]
前一个代码的非Python性的三个主要症状:
使用算术运算符,在这种情况下,熟悉python习惯用法的人会使用type methods list.append;
列表中的输入,其中明显的数据类型应该是字典,尽管并不总是能够控制如何获取数据;
而且,最严重的症状是,当它实际上需要一本字典时,输出是一个列表列表。
因此,一种更具python风格的方式,返回字典而不是列表:
def convert_grades(lst):
out = []
for element in grade:
if isinstance(element, str):
buf = [] # re-initializes 'buf' everytime there is a string
out.append(buf)
buf.append(element)
return out
希望这有帮助 具有相同输入和输出形式的建议:
>>> convert_grades(['Ben Anderson',95,90,100,-1,'Mary Johnson',75,78,79,-5,'Michael Walter',80,68,0])
[['Ben Anderson', 95, 90, 100], ['Mary Johnson', 75, 78, 79], ['Michael Walter', 80, 68, 0]]
前一个代码的非Python性的三个主要症状:
使用算术运算符,在这种情况下,熟悉python习惯用法的人会使用type methods list.append;
列表中的输入,其中明显的数据类型应该是字典,尽管并不总是能够控制如何获取数据;
而且,最严重的症状是,当它实际上需要一本字典时,输出是一个列表列表。
因此,一种更具python风格的方式,返回字典而不是列表:
def convert_grades(lst):
out = []
for element in grade:
if isinstance(element, str):
buf = [] # re-initializes 'buf' everytime there is a string
out.append(buf)
buf.append(element)
return out
希望这有帮助 还有另一个答案,尽管我比自己更喜欢,还有一些评论和建议:
def convert_grades(lst):
out = {}
for element in grade:
if isinstance(element, str):
key = element
out[key] = []
else:
out[key].append(element) ## mind that this would raise an error if first element in lst is not string
return out
print convert_grades(grade)
在这里,lst[c]指向列表中的第一项,意思是字符串“Ben Anderson”,它既不小于0,也不是空列表,因此while循环永远不会执行
三,
它通常被认为是pythonic,让你的代码遵循“后悔胜于安全”的思想,因此在你的示例中,你可以尝试解析int,如果它失败了。。。好然后你可以假设它是一个字符串
c = 0
while lst[c] < 0 or lst[c] == []:
在您的情况下可以等效:
if isinstance(element, str):
#do stuff for string
else:
#do other stuff (for int)
要小心,因为即使5实际上是str,int5也不会抛出任何异常。它将为您提供一个值为5的int
四,
如果你是初学者,print是你的朋友 还有另一个答案,尽管我比自己更喜欢,还有一些评论和建议:
def convert_grades(lst):
out = {}
for element in grade:
if isinstance(element, str):
key = element
out[key] = []
else:
out[key].append(element) ## mind that this would raise an error if first element in lst is not string
return out
print convert_grades(grade)
在这里,lst[c]指向列表中的第一项,意思是字符串“Ben Anderson”,它既不小于0,也不是空列表,因此while循环永远不会执行
三,
它通常被认为是pythonic,让你的代码遵循“后悔胜于安全”的思想,因此在你的示例中,你可以尝试解析int,如果它失败了。。。好然后你可以假设它是一个字符串
c = 0
while lst[c] < 0 or lst[c] == []:
在您的情况下可以等效:
if isinstance(element, str):
#do stuff for string
else:
#do other stuff (for int)
要小心,因为即使5实际上是str,int5也不会抛出任何异常。它将为您提供一个值为5的int
四,
如果你是初学者,print是你的朋友 为了完整起见,您可以将此结构[str,int,int,str,int]视为一个堆栈,从左侧弹出到所需的结构中:
try:
int(element)
#do other stuff (for int)
except ValueError:
#do stuff for string
印刷品:
grades=['Ben Anderson',95,90,100,-1,'Mary Johnson',75,78,79,-5,'Michael Walter',80,68,0]
converted_list=[]
while grades:
temp=[grades.pop(0)]
while grades and isinstance(grades[0],int):
temp.append(grades.pop(0))
converted_list.append(temp)
print converted_list
d={}
while grades:
name=grades.pop(0)
d[name]=[]
while grades and isinstance(grades[0],int):
d[name].append(grades.pop(0))
print d
您可以使用相同的方法创建字典,这似乎是一种更好的数据结构:
[['Ben Anderson', 95, 90, 100, -1], ['Mary Johnson', 75, 78, 79, -5], ['Michael Walter', 80, 68, 0]]
印刷品:
grades=['Ben Anderson',95,90,100,-1,'Mary Johnson',75,78,79,-5,'Michael Walter',80,68,0]
converted_list=[]
while grades:
temp=[grades.pop(0)]
while grades and isinstance(grades[0],int):
temp.append(grades.pop(0))
converted_list.append(temp)
print converted_list
d={}
while grades:
name=grades.pop(0)
d[name]=[]
while grades and isinstance(grades[0],int):
d[name].append(grades.pop(0))
print d
虽然这是可行的,但IMHO的答案是最“Pythonic”的。为了完整起见,您可以将此结构[str,int,int,str,int]视为一个堆栈,并从左侧弹出到所需的结构中:
try:
int(element)
#do other stuff (for int)
except ValueError:
#do stuff for string
印刷品:
grades=['Ben Anderson',95,90,100,-1,'Mary Johnson',75,78,79,-5,'Michael Walter',80,68,0]
converted_list=[]
while grades:
temp=[grades.pop(0)]
while grades and isinstance(grades[0],int):
temp.append(grades.pop(0))
converted_list.append(temp)
print converted_list
d={}
while grades:
name=grades.pop(0)
d[name]=[]
while grades and isinstance(grades[0],int):
d[name].append(grades.pop(0))
print d
您可以使用相同的方法创建字典,这似乎是一种更好的数据结构:
[['Ben Anderson', 95, 90, 100, -1], ['Mary Johnson', 75, 78, 79, -5], ['Michael Walter', 80, 68, 0]]
印刷品:
grades=['Ben Anderson',95,90,100,-1,'Mary Johnson',75,78,79,-5,'Michael Walter',80,68,0]
converted_list=[]
while grades:
temp=[grades.pop(0)]
while grades and isinstance(grades[0],int):
temp.append(grades.pop(0))
converted_list.append(temp)
print converted_list
d={}
while grades:
name=grades.pop(0)
d[name]=[]
while grades and isinstance(grades[0],int):
d[name].append(grades.pop(0))
print d
虽然这是可行的,但IMHO的答案是最“通灵的”如果你想理解,这是可行的:
{'Mary Johnson': [75, 78, 79, -5], 'Michael Walter': [80, 68, 0], 'Ben Anderson': [95, 90, 100, -1]}
或者,如果您想要一本词典:
grades=['Ben Anderson',95,90,100,-1,'Mary Johnson',75,78,79,-5,'Michael Walter',80,68,0]
eyes=[i for i, x in enumerate(grades)
if isinstance(x,str)]+[len(grades)+1] # index of the strings
LofSL=[(i,j) for i,j in zip(eyes[:-1],eyes[1:])] # slices for each list
LoL=[grades[t[0]:t[1]] for t in LofSL] # your list of lists
如果你想要理解,这是可行的:
{'Mary Johnson': [75, 78, 79, -5], 'Michael Walter': [80, 68, 0], 'Ben Anderson': [95, 90, 100, -1]}
或者,如果您想要一本词典:
grades=['Ben Anderson',95,90,100,-1,'Mary Johnson',75,78,79,-5,'Michael Walter',80,68,0]
eyes=[i for i, x in enumerate(grades)
if isinstance(x,str)]+[len(grades)+1] # index of the strings
LofSL=[(i,j) for i,j in zip(eyes[:-1],eyes[1:])] # slices for each list
LoL=[grades[t[0]:t[1]] for t in LofSL] # your list of lists
建议:为了帮助您进行调试,请使用print everywhere查看正在发生的事情。如果是的话,大部分你的逻辑都不正确。这是调试问题的最简单方法。我想说,while从未执行过。。。不确定,though@BorrajaX是 啊因为第一个元素是Ben Anderson,它是一个字符串。第二个条件是lst[0]必须是空列表,而不是空列表。所以它总是返回false:无论如何,这段代码非常不符合pythonic…@heltonbiker是的,它是tr
ue。因为我是一个初学者…建议:为了帮助您调试,使用print everywhere查看正在发生的事情。如果是的话,大部分你的逻辑都不正确。这是调试问题的最简单方法。我想说,while从未执行过。。。不确定,though@BorrajaX是 啊因为第一个元素是Ben Anderson,它是一个字符串。第二个条件是lst[0]必须是空列表,而不是空列表。所以它总是返回false:无论如何,这段代码非常不符合pythonic…@heltonbiker是的,这是真的。因为我是一个初学者……你应该解释为什么他的原始代码是错误的:有一个明显的问题,就是给他看指纹。lst[0]<0总是错误的。实际上,这是一个糟糕的测试。您应该解释为什么他的原始代码是错误的:有一个明显的问题,就是向他显示打印。lst[0]<0总是错误的。事实上,这是一个糟糕的测试。为什么要投否决票?我知道这并不能完全回答我的代码出了什么问题?问题,但提供另一种解决方案可以帮助OP以不同的方式思考问题。没有解释的否决票是没有建设性的,对任何人都没有帮助这是一个非常好的答案!这可能会鼓励初学者去研究这一切意味着什么,这是最好的学习方式。为什么会投反对票?我知道这并不能完全回答我的代码出了什么问题?问题,但提供另一种解决方案可以帮助OP以不同的方式思考问题。没有解释的否决票是没有建设性的,对任何人都没有帮助这是一个非常好的答案!它可能会鼓励初学者去探究这一切意味着什么,这是最好的学习方式。