打印具有特定格式的字典

printing a dictionary with specific format

我已经完成了我的项目,我想打印我的结果。 我有一本这样的字典: {('a',): 4, ('b',): 5, ('c', 'd'): 3, ('e', 'f'): 4, ('g', 'h'): 3, ('i',): 3}

有些键值对中的键是一个元素,有些是两个或三个。 我想以这种格式打印它,一行中有一个键的元素,一行中有两个键的元素等...

(elem,)
(elem1, elem2, ..., elem_n)

我试过这个:

itemdct //my dict
result = [itemdct]
csv_writer = csv.writer(sys.stdout, delimiter=';')
row = []
for itemdct in result:
    for key in sorted(itemdct.keys()):
        row.append("{0}:{1}".format(key, itemdct[key]))
csv_writer.writerow(row)

但我的输出是一行这样的。

('a',):3;('b',):4;('c', 'd'):3;('e', 'f'):3;......

mydict是这样的

{('a',): 3, ('b', 'c'): 3, ....}

结果是这样的

[{('a',): 3, ('b', 'c'): 3,.....}]

提前谢谢你..

编辑:我希望我的输出是这样的:

('a',):3;('c',):4;('c',):5;('d',):6;('e',):3
('a', 'c'):3;('b', 'd'):3;('c', 'd'):4

使用itertools.groupby(需要注意的是一定要先排序,因为groupby会在key值变化的时候新建一个组):

from itertools import groupby
d = {('a',): 4, ('b',): 5, ('c', 'd'): 3, ('e', 'f'): 4, ('g', 'h'): 3, ('i',): 3}
for i, g in groupby(sorted(d.items(), key = lambda k: len(k[0])), lambda k: len(k[0])):
  print(';'.join('%s:%s' %(k,v) for k,v in g))

## -- End pasted text --
('a',):4;('i',):3;('b',):5
('e', 'f'):4;('g', 'h'):3;('c', 'd'):3

p.s。我不确定你的任务是什么,但你可能不应该使用元组作为字典中的键。

这有两个步骤。第一个是整理出什么条目进入哪一行,另一个是打印那些行。

from collections import defaultdict

d = {('a',): 4, ('b',): 5, ('c', 'd'): 3, ('e', 'f'): 4, ('g', 'h'): 3, ('i',): 3}

keysize = defaultdict(list)
for key in d:
    keysize[len(key)].append("{}:{}".format(key, h[key]))

for size, line in keysize.iteritems():
    print ", ".join(line)

您可以根据关键字长度对字典中的项目进行排序。您可以使用 groupby 按密钥长度分组并打印每个组。

def printDict(myDict):
    from itertools import groupby
    def sortFunc(item):
        return len(item[0])

    sortedItems = sorted(myDict.items(), key=sortFunc)
    groups = groupby(sortedItems, sortFunc)
    for _, group in groups:         
        print( ';'.join('%s:%s' % entry for entry in group))

输出:

>>> printDict({('a',): 4, ('b',): 5, ('c', 'd'): 3, ('e', 'f'): 4, ('g', 'h'): 3, ('i',): 3})
('a',):4;('i',):3;('b',):5
('e', 'f'):4;('g', 'h'):3;('c', 'd'):3