Python 3.6-格式问题(其他小问题) A部分-空行

Python 3.6-格式问题(其他小问题) A部分-空行,python,python-3.x,format,Python,Python 3.x,Format,我目前正在研究Kyran Dale用Python和JavaScript实现的数据可视化。从示例3.1中,我有以下内容: nobel_winners = [ {'name' : 'Albert Einstein', 'nationality': 'German', 'sex' : 'male', 'category' : 'Physics', 'year' : 1921}, {'name' : 'Paul Dirac', 'nati

我目前正在研究Kyran Dale用Python和JavaScript实现的数据可视化。从示例3.1中,我有以下内容:

nobel_winners = [
{'name'       : 'Albert Einstein',
 'nationality': 'German', 
 'sex'        : 'male',
 'category'   : 'Physics',
 'year'       : 1921},
{'name'       : 'Paul Dirac',
 'nationality': 'British', 
 'sex'        : 'male',
 'category'   : 'Physics', 
 'year'       : 1933},
{'name'       : 'Marie Curie',
 'nationality': 'Polish', 
 'sex'        : 'female',
 'category'   : 'Chemistry', 
 'year'       : 1911}
]

cols = nobel_winners[0].keys()
# cols.sort() # <<== this produces an error - see below

with open('./nobel_winners.csv', 'w') as f:
    f.write(','.join(cols) + '\n')

    for o in nobel_winners:
        row = [str(o[col]) for col in cols]
        f.write(','.join(row) + '\n')

with open('./nobel_winners.csv') as f:
    for line in f.readlines():
        print(line),
这很好,但是,当我打印输出(最后3行代码)时,我得到:

[pol@UNKNOWN example_3.1]$ python example3.1.py 
name,nationality,sex,category,year

Albert Einstein,German,male,Physics,1921

Paul Dirac,British,male,Physics,1933

Marie Curie,Polish,female,Chemistry,1911

[pol@UNKNOWN example_3.1]$
i、 每行之间都有空格(我不想要!)。作者特别地谈到了此处末尾的逗号(代码的最后一行)print(行),“在print函数调用后添加逗号会禁止添加不必要的换行符。”

显然,事实并非如此。如果删除逗号,则得到相同的结果,即打印输出中的空格

我想知道:

  • 如何获得“干净”的打印输出-即没有空行,以及

  • 一些关于作者试图做什么的见解-这个逗号“把戏”应该做什么?它应该如何工作

  • B部分-较小的点,但仍然很好奇。 如果我取消对cols.sort()行的注释,我会得到以下结果:

    [pol@UNKNOWN example_3.1]$ python example3.1.py 
    name,nationality,sex,category,year
    
    Albert Einstein,German,male,Physics,1921
    
    Paul Dirac,British,male,Physics,1933
    
    Marie Curie,Polish,female,Chemistry,1911
    
    [pol@UNKNOWN example_3.1]$
    
    [pol@UNKNOWN示例_3.1]$python示例3.1.py 回溯(最近一次呼叫最后一次): 文件“example3.1.py”,第20行,在
    cols.sort()#这听起来都像是作者对脚本使用了不同的Python版本。我推荐Python 3中的以下两个代码段:

  • 打印(line,end=”“)
    删除换行符后缀和
  • sorted(cols)
    甚至
    sorted(诺贝尔奖获得者[0])
    ,因为它会自动使用dict键。否则您必须使用
    排序(诺贝尔奖获得者[0].values())

  • 海事组织没有解释问题的某些部分:

    现在,我甚至不明白作者的意思

  • 为什么他试图使用一种不存在的方法

  • 即使它确实起了作用,但有什么意义呢?他只会让列标题与数据不同步


  • 答复1:

    cols = nobel_winners[0].keys()
    # cols.sort() # <<== this produces an error - see below
    
    生成的
    数据不再与原始dict连接

    @stackels答案中提到的
    sorted
    方法也很好。它还制作了一个副本

    dict值也是如此


    答复二:


    现在还不完全清楚,为什么作者更喜欢排序顺序,但他肯定需要设置一些列的顺序,因为常规dict中的数据顺序没有定义。因此,他设置列顺序,并对标题和所有数据行使用相同的顺序。因此它们不能失去同步。

    print
    上的尾随逗号是用于Python 2.x的,在Python 3.x中,它不会做任何有用的事情,因为
    print
    现在是一个函数(出于类似目的,它使用
    end
    参数)
    dict.keys
    用于生成列表,该列表具有
    .sort
    方法。长话短说:这段代码不是为Python3编写的。谢谢你,但是为什么我必须在行尾输入任何东西呢?为什么它不能按原样打印文件,并将换行符视为给定行的一部分和结尾?关于Python2/3的真正痛苦-作者明确表示他将使用3!!!谢谢你,但是把可乐分类有什么意义呢?这不会使列标题与数据不同步吗?在这种情况下不会,因为他对列进行排序,然后两者都进行排序,所以使用键作为标题行,然后以相同的顺序写入每个值:
    [str(o[col])表示col in cols]
    谢谢-但为什么我必须在行尾输入任何内容-为什么它不能按原样打印文件,并将换行符视为给定行的一部分和行尾?关于Python2/3的真正痛苦-作者明确表示他将使用3!p、 你在之前的评论中忘记了什么吗?我现在可以看到,排序不会影响数据-如果对“COL”进行排序,则批次将被排序!我不确定你的问题是什么。
    sorted()
    函数应返回对象的副本。如果您想使用
    cols
    ,请使用
    cols=sorted(诺贝尔奖获得者[0])
    keys = list(somedict.keys())