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以不同的方式思考问题。没有解释的否决票是没有建设性的,对任何人都没有帮助这是一个非常好的答案!它可能会鼓励初学者去探究这一切意味着什么,这是最好的学习方式。