【问题标题】:printing a dictionary with specific format打印具有特定格式的字典
【发布时间】:2015-06-01 08:20:36
【问题描述】:

我已经完成了我的项目,我想打印我的结果。 我有一本这样的字典: {('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

【问题讨论】:

  • 那么鉴于您的示例输入 - 究竟是什么所需的输出?
  • 你能不能 edit 把它变成你的问题 - 所以它可能是格式化的 :)
  • 你能解释一下换行符应该在哪里吗?每4行?究竟是什么问题?
  • 换行符不固定,第一行应该有一个键('a',)的所有元素,第二行应该有两个键('a','b')的元素
  • 呃元组键不是字典的好格式,但您可能想要的是sorted(d.items(), key=lambda k: len(k)),然后是一个 if 语句以在循环或平分中打印\n

标签: python dictionary printing


【解决方案1】:

您可以根据关键字长度对字典中的项目进行排序。您可以使用 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

【讨论】:

  • 我会在几秒钟内尝试一下。谢谢(编辑:它正在工作!)
  • 猜猜反对票是因为不是 pythonic ......现在应该是:D
  • 我没有选中它,而是用groupby 发布了一个解决方案——虽然我猜你的答案现在基本上是一样的;p
  • @user3467349 是的,我对我的回答也不太满意......然后我想到了 groupby:D
【解决方案2】:

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

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)

【讨论】:

    【解决方案3】:

    使用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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 2017-05-14
      相关资源
      最近更新 更多