【问题标题】:Output formatting Python 3.3输出格式化 Python 3.3
【发布时间】:2013-05-24 18:56:15
【问题描述】:

所以这可能是关于在 python 中使用 '.format' 进行输出格式化的一个非常基本的问题,而且由于我是初学者,我无法终生解决这个问题。我试图尽可能详细,以确保没有混淆。

让我给你一个例子,这样你就可以更好地理解我的困境。考虑以下程序

list = (['wer', 'werwe', 'werwe' ,'wer we'])   # list[0], list[1], list[2], list[3]
list.append(['vbcv', 'cvnc', 'bnfhn', 'mjyh']) # list[4]
list.append(['yth', 'rnhn', 'mjyu', 'mujym'])  # list[5]
list.append(['cxzz', 'bncz', 'nhrt', 'qweq'])  # list[6]

first = 'bill'
last = 'gates'

print ('{:10} {:10} {:10} {:10}'.format(first,last,list[5], list[6]))     

可以理解,这会给出输出:

bill       gates      ['yth', 'rnhn', 'mjyu', 'mujym'] ['cxzz', 'bncz', 'nhrt', 'qweq']

所以这是我真正的问题。我正在从书中做这个练习题,我不明白答案。下面的程序会让您很好地了解我们要获得什​​么样的输出:

students = []
students.append(['DeMoines', 'Jim', 'Sophomore', 3.45]) #students[0]
students.append(['Pierre', 'Sophie', 'Sophomore', 4.0]) #students[1]
students.append(['Columbus', 'Maria', 'Senior', 2.5])   #students[2]
students.append(['Phoenix', 'River', 'Junior', 2.45])   #students[3]
students.append(['Olympis', 'Edgar',  'Junior', 3.99])  #students[4]
students.append(['van','john', 'junior', 3.56])         #students[5]
def Grades(students):
    print ('Last       First      Standing        GPA')
    for students in students:
        print('{0:10} {1:10} {2:10} {3:8.2f}'.format(students[0],students[1],students[2],students[3]))

我们试图得到的输出是一种表格,它提供了所有学生的所有统计数据 -

Last       First      Standing        GPA
DeMoines   Jim        Sophomore      3.45
Pierre     Sophie     Sophomore      4.00
Columbus   Maria      Senior         2.50
Phoenix    River      Junior         2.45
Olympis    Edgar      Junior         3.99
van        john       junior         3.56

所以这就是我不明白的。我们在两个示例中使用基本相同的东西,即列表中的列表。对于我的第一个示例,打印语句是:

print('{:10} {:10} {:10} {:10}'.format(first, last, list[5], list[6]))  

其中list[5]list[6] 是列表本身,它们被完整打印,正如您从输出中看到的那样。 但这不会发生在图书问题中。在那里,打印语句说

print('{0:10} {1:10} {2:10} {3:8.2f}'.format(students[0], students[1], students[2], students[3])) 

从表格输出中可以看出,这里的students[0] 仅指'DeMoines'。但是,如果您只是在 Python 解释器中运行语句 students[0],它会给出整个子列表,因为它应该。

['DeMoines', 'Jim', 'Sophomore', 3.45]

所以,基本上,我有两个问题,为什么students[0] 有两种不同的含义,为什么students[0] 不像我们对list[5]list[6] 那样打印整个列表?

【问题讨论】:

  • 如果我可以提供一个建议:尝试缩短您的示例并澄清问题陈述。如果你的问题更中肯,你会得到更多的关注。
  • 我会记住这一点。谢谢。

标签: python python-3.x output-formatting


【解决方案1】:

看看for循环

for students in students:
#   ^^^^^^^^

所以,students(inside loop) 实际上并不是指list of list。正如预期的那样,students[0] 指的是 list of lists 中的 element 中的 first element

我建议将函数参数中的students 替换为all_students 或类似的东西。

【讨论】:

  • 谢谢。我想我现在有点明白了。如果我错了,那么正确,当我们对一个列表(或者在我们的例子中发生的情况,一个列表的列表)执行一个 for 循环时,它以某种方式改变了 'students[0]' 的含义(指绝对第一个元素),当它在 for 循环中时。但是,在 for 循环之外 'students[0]' 仍然指的是子列表。
  • 一点更正:“它以某种方式改变了 'students[0]' 的含义” - 不是以某种方式。再次查看 for 循环。它的形式为for <element_name> in <iterable_object>。主要问题是您的情况 element_nameiterable_object 具有相同的名称。
  • @Kye 使用for x in x 是一个非常令人困惑的结构。我的猜测是,如果您将其重写为for student in students,您将能够更好地看到发生了什么,就像这样:for student in students: print('{0:10} {1:10} {2:10} {3:8.2f}'.format(student[0],student[1],student[2],student[3]))
  • 谢谢大家。感谢所有的反馈。我现在明白这个问题了。
【解决方案2】:

尝试将变量 list 重命名为不是保留字或内置函数或类型的名称。

如果您重新定义或以非预期方式使用保留字或内置命令,初学者会感到困惑 - 迟早会发生在每个人身上。

如果你这样做

list = [1, 2, 3, 4]

您重新绑定名称 list 以不再指向内置的 list 数据类型,而是指向当前范围内的实际列表 [1, 2, 3, 4]。这几乎总是不是你打算做的。使用变量dir 是一个类似的陷阱。

也不要在列表赋值的方括号周围使用额外的括号()words = ['wer', 'werwe', 'werwe' ,'wer we'] 之类的就足够了。

通常考虑为变量选择哪些名称。 students 是描述性的、有用的评论,list 不是。此外,如果list 当前包含一个列表,您的算法可能会在稍后更改为包含set 或任何其他容器类型的变量。那么基于类型的变量名甚至会产生误导。

【讨论】:

  • “你覆盖了定义,从而覆盖了内置 list 数据类型的含义。” - 错误的。当你命名一个像 builtin 这样的变量时,你唯一要做的就是在变量的范围内隐藏 builtin(这在 list 的情况下几乎不是问题,因为不能使用的类型的用例并不多用列表理解或文字解决)。调用变量list 时最重要的问题是该名称根本不具有描述性,并且除了明显的事实是它是一个列表之外,不会向读者提供有关变量或其内容的任何信息。
  • @l4mpi:内置列表的含义仅在该变量的范围内被覆盖是正确的。然而,它确实得到了重新定义。在回答初学者的问题时,有时最好不要提供太多未经询问的细节。关于不精确和无用的变量名称的观点也是一个很好的观点,因此我将两者都编辑到了我的答案中。请重新考虑否决票(如果它是由您完成的)。请记住,SO 就是提供最佳答案和建设性批评。您可以自己轻松地将“范围”编辑到答案中...
  • @l4mpi:我再次编辑了我的措辞,因为我使用的“重新定义”这个词确实具有误导性。感谢您的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多