Python 如何按键对字典进行排序并创建CSV

Python 如何按键对字典进行排序并创建CSV,python,sorting,python-2.7,csv,Python,Sorting,Python 2.7,Csv,我有一个python字典,每个键都可以有一个可变数量的值(按列表排列) 例如: {'607': [36146], '448': [50890, 44513], '626': [44349, 44436]} 我要做的是生成此信息的CSV,格式如下: 448 , 607 , 626 50890,36146,44349 44513, ,44436 目前,我的代码可以生成这样的CSV,唯一的问题是CSV的列没有按照键的升序进行排序。到目前为止,我的代码如下: csv_file = 'fil

我有一个python字典,每个键都可以有一个可变数量的值(按列表排列)

例如:

{'607': [36146], '448': [50890, 44513], '626': [44349, 44436]}
我要做的是生成此信息的CSV,格式如下:

 448 , 607 , 626
50890,36146,44349
44513,     ,44436
目前,我的代码可以生成这样的CSV,唯一的问题是CSV的列没有按照键的升序进行排序。到目前为止,我的代码如下:

csv_file = 'file.csv'
with open(csv_file, 'wb') as fd:
    writer = csv.writer(fd, delimiter = ',')

    # Format headers for aesthetics
    csv_headers = [' {} '.format(elem) for elem in dictionary.keys()]

    writer.writerow(headers)

    # Format data to create convenient csv format
    csv_data = itertools.izip_longest(*dictionary.values(), fillvalue = '     ')
    writer.writerows(csv_data)
正如您所看到的,我将键从值中分离出来,并分别编写它们,但是如果我想按键对列进行排序,我想这可能不是最好的方法。因此,我希望有人能为我指明正确的方向。

你有两个选择:

  • 对键进行排序,然后按相同的顺序提取值,而不是依赖于
    dictionary.values()
  • 每行使用一个字典并生成字典
选项1如下所示:

csv_file = 'file.csv'
with open(csv_file, 'wb') as fd:
    writer = csv.writer(fd, delimiter=',')

    keys = sorted(dictionary) 
    # Format headers for aesthetics
    headers = [' {} '.format(key) for key in keys]
    writer.writerow(headers)

    # Format data to create convenient csv format
    csv_data = itertools.izip_longest(*(dictionary[key] for key in keys),
                                      fillvalue='     ')
    writer.writerows(csv_data)
使用
DictWriter
看起来像:

csv_file = 'file.csv'
with open(csv_file, 'wb') as fd:
    writer = csv.DictWriter(
        fd, sorted(dictionary), delimiter=',')
    # write formatted headers
    writer.writerow({k: ' {} '.format(k) for k in dicitonary})

    csv_data = itertools.izip_longest(*dictionary.values(), fillvalue='     ')
    writer.writerows(dict(zip(dictionary, row)) for row in csv_data)
您有两个选择:

  • 对键进行排序,然后按相同的顺序提取值,而不是依赖于
    dictionary.values()
  • 每行使用一个字典并生成字典
选项1如下所示:

csv_file = 'file.csv'
with open(csv_file, 'wb') as fd:
    writer = csv.writer(fd, delimiter=',')

    keys = sorted(dictionary) 
    # Format headers for aesthetics
    headers = [' {} '.format(key) for key in keys]
    writer.writerow(headers)

    # Format data to create convenient csv format
    csv_data = itertools.izip_longest(*(dictionary[key] for key in keys),
                                      fillvalue='     ')
    writer.writerows(csv_data)
使用
DictWriter
看起来像:

csv_file = 'file.csv'
with open(csv_file, 'wb') as fd:
    writer = csv.DictWriter(
        fd, sorted(dictionary), delimiter=',')
    # write formatted headers
    writer.writerow({k: ' {} '.format(k) for k in dicitonary})

    csv_data = itertools.izip_longest(*dictionary.values(), fillvalue='     ')
    writer.writerows(dict(zip(dictionary, row)) for row in csv_data)
您有两个选择:

  • 对键进行排序,然后按相同的顺序提取值,而不是依赖于
    dictionary.values()
  • 每行使用一个字典并生成字典
选项1如下所示:

csv_file = 'file.csv'
with open(csv_file, 'wb') as fd:
    writer = csv.writer(fd, delimiter=',')

    keys = sorted(dictionary) 
    # Format headers for aesthetics
    headers = [' {} '.format(key) for key in keys]
    writer.writerow(headers)

    # Format data to create convenient csv format
    csv_data = itertools.izip_longest(*(dictionary[key] for key in keys),
                                      fillvalue='     ')
    writer.writerows(csv_data)
使用
DictWriter
看起来像:

csv_file = 'file.csv'
with open(csv_file, 'wb') as fd:
    writer = csv.DictWriter(
        fd, sorted(dictionary), delimiter=',')
    # write formatted headers
    writer.writerow({k: ' {} '.format(k) for k in dicitonary})

    csv_data = itertools.izip_longest(*dictionary.values(), fillvalue='     ')
    writer.writerows(dict(zip(dictionary, row)) for row in csv_data)
您有两个选择:

  • 对键进行排序,然后按相同的顺序提取值,而不是依赖于
    dictionary.values()
  • 每行使用一个字典并生成字典
选项1如下所示:

csv_file = 'file.csv'
with open(csv_file, 'wb') as fd:
    writer = csv.writer(fd, delimiter=',')

    keys = sorted(dictionary) 
    # Format headers for aesthetics
    headers = [' {} '.format(key) for key in keys]
    writer.writerow(headers)

    # Format data to create convenient csv format
    csv_data = itertools.izip_longest(*(dictionary[key] for key in keys),
                                      fillvalue='     ')
    writer.writerows(csv_data)
使用
DictWriter
看起来像:

csv_file = 'file.csv'
with open(csv_file, 'wb') as fd:
    writer = csv.DictWriter(
        fd, sorted(dictionary), delimiter=',')
    # write formatted headers
    writer.writerow({k: ' {} '.format(k) for k in dicitonary})

    csv_data = itertools.izip_longest(*dictionary.values(), fillvalue='     ')
    writer.writerows(dict(zip(dictionary, row)) for row in csv_data)

我进行了排序,最后得到了
key
的转换元组和列表的
iterable
,然后从那里开始:

import csv
from itertools import izip_longest

d = {'607': [36146], '448': [50890, 44513], '626': [44349, 44436]}

with open('output.csv', 'wb') as fout:
    csvout = csv.writer(fout)
    header, rows = zip(*sorted((k, iter(v)) for k, v in d.iteritems()))
    csvout.writerow(format(el, '^5') for el in header)
    csvout.writerows(izip_longest(*rows, fillvalue='     '))

我进行了排序,最后得到了
key
的转换元组和列表的
iterable
,然后从那里开始:

import csv
from itertools import izip_longest

d = {'607': [36146], '448': [50890, 44513], '626': [44349, 44436]}

with open('output.csv', 'wb') as fout:
    csvout = csv.writer(fout)
    header, rows = zip(*sorted((k, iter(v)) for k, v in d.iteritems()))
    csvout.writerow(format(el, '^5') for el in header)
    csvout.writerows(izip_longest(*rows, fillvalue='     '))

我进行了排序,最后得到了
key
的转换元组和列表的
iterable
,然后从那里开始:

import csv
from itertools import izip_longest

d = {'607': [36146], '448': [50890, 44513], '626': [44349, 44436]}

with open('output.csv', 'wb') as fout:
    csvout = csv.writer(fout)
    header, rows = zip(*sorted((k, iter(v)) for k, v in d.iteritems()))
    csvout.writerow(format(el, '^5') for el in header)
    csvout.writerows(izip_longest(*rows, fillvalue='     '))

我进行了排序,最后得到了
key
的转换元组和列表的
iterable
,然后从那里开始:

import csv
from itertools import izip_longest

d = {'607': [36146], '448': [50890, 44513], '626': [44349, 44436]}

with open('output.csv', 'wb') as fout:
    csvout = csv.writer(fout)
    header, rows = zip(*sorted((k, iter(v)) for k, v in d.iteritems()))
    csvout.writerow(format(el, '^5') for el in header)
    csvout.writerows(izip_longest(*rows, fillvalue='     '))

我的字典性质参差不齐,我该怎么做呢?我曾尝试使用csv.Dictwriter,但它不能很好地处理每个列表的可变条目数…太棒了!选项1就像一个符咒,但是,选项2不写标题值?另外,在你看来,哪一种方法更适合于肾盂手术?谢谢。虽然我认为选项2可能是您使用DictWriter时最具python风格的选项,但令我的OCD部分感到不安的是,我无法格式化标题:(@user1182556:我输入了格式化标题,但忽略了字段名必须是有效键;我替换了
writeheader()
改为呼叫。您仍然可以自由编写自己的行,只要它是一个以字段名为键的字典。由于字典的不均匀性,我将如何执行上述操作?我曾尝试使用csv.Dictwriter,但它不能很好地处理每个列表中的可变条目数…太好了!选项1很有魅力,但是,Option 2不写标题值?另外,在你看来,哪种方法更具Python风格?谢谢。虽然我认为选项2可能是你使用DictWriter时最具Python风格的方法-但我无法格式化标题,这让我的OCD部分感到不安:(@user1182556:我输入了格式化的头,但忽略了字段名必须是有效的键;我替换了
writeheader()
改为呼叫。您仍然可以自由编写自己的行,只要它是一个以字段名为键的字典。由于字典的不均匀性,我将如何执行上述操作?我曾尝试使用csv.Dictwriter,但它不能很好地处理每个列表中的可变条目数…太好了!选项1很有魅力,但是,Option 2不写标题值?另外,在你看来,哪种方法更具Python风格?谢谢。虽然我认为选项2可能是你使用DictWriter时最具Python风格的方法-但我无法格式化标题,这让我的OCD部分感到不安:(@user1182556:我输入了格式化的头,但忽略了字段名必须是有效的键;我替换了
writeheader()
改为呼叫。您仍然可以自由编写自己的行,只要它是一个以字段名为键的字典。由于字典的不均匀性,我将如何执行上述操作?我曾尝试使用csv.Dictwriter,但它不能很好地处理每个列表中的可变条目数…太好了!选项1很有魅力,但是,Option 2不写标题值?另外,在你看来,哪种方法更具Python风格?谢谢。虽然我认为选项2可能是你使用DictWriter时最具Python风格的方法-但我无法格式化标题,这让我的OCD部分感到不安:(@user1182556:我输入了格式化的标题,但忽略了字段名必须是有效的键;我替换了
writeheader()
调用。您仍然可以自由编写自己的行,只要它是一个以字段名为键的字典。不错,但是
iter()
调用在这里是多余的。存储列表引用或列表迭代器对象引用并不重要,但后者将由
izip_longest()
创建。很好,但是
iter()
调用在这里是多余的。存储列表引用或列表迭代器对象引用并不重要,但后者将由
izip_longest()
创建。很好,但是
iter()
调用