我已经完成了我的项目,我想打印我的结果。
我有这样的字典:
{('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
答案 0 :(得分:0)
使用itertools.groupby
(需要注意的一点是,您必须先排序,因为groupby会在键值更改时创建新组):
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。我不确定你的任务是什么,但你可能不应该使用元组作为字典中的键。
答案 1 :(得分:0)
这有两个步骤。第一个是整理哪个条目进入哪一行,另一个是打印这些行。
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)
答案 2 :(得分:0)
您可以根据密钥长度对字典中的项目进行排序。您可以使用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