我有这种形式的词典......
d={'s1':{'a':[1,2,3],'b':[4,5,6]},'s2':{'d':[77,88,99],'e':[666,333,444]}}
所以我想以这种格式打印
s1
a, 1
b,4
s1
s1
a,2
b,5
s1
s1
a,3
b,6
s1
s2
d,77
e,666
s2
s2
d,88
e,333
s2
s2
d,99
e,444
s2
我试过这个方法
for k,v in d.items():
print k
for key,val in v.items():
print key,val[0] # But this v[0] should change and key also should changthat i am not getting for same loop
print k
所以我必须为所有值打印主键,其中值是另一个dict,每次我应该打印每个列表项的键时该dict 任何人都可以提前帮助我
答案 0 :(得分:3)
>>> from itertools import product, starmap
>>> d={'s1':{'a':[1,2,3],'b':[4,5,6]},'s2':{'d':[77,88,99],'e':[666,333,444]}}
>>> for k,v in sorted(d.items()): # use d.iteritems for py2
for x,y in zip(*starmap(product,sorted(v.items()))):
print k
print '{0},{1}'.format(*x)
print '{0},{1}'.format(*y)
print k
print
s1
a,1
b,4
s1
s1
a,2
b,5
s1
s1
a,3
b,6
s1
s2
d,77
e,666
s2
s2
d,88
e,333
s2
s2
d,99
e,444
s2
<强>解释强>
它使用字典中每个列表的键获取值对
{'a':[1,2,3],'b':[4,5,6]}
变为
[(('a', 1), ('b', 4)), (('a', 2), ('b', 5)), (('a', 3), ('b', 6))]
以下是如何做到的:
第一行遍历d
中的每个键和值。这些必须进行排序,因此我可以按升序迭代,因为词典没有订单。
键的值是一个类似下面的字典,它按键,值对的元组排序。
d = {'a':[1,2,3],'b':[4,5,6]}
>>> sorted(d.items())
[('a', [1, 2, 3]), ('b', [4, 5, 6])]
然后product
用于获取与每个值配对的密钥。
>>> [product(*x) for x in sorted(d.items())]
# iterates through [('a', 1), ('a', 2), ('a', 3)], [('b', 4), ('b', 5), ('b', 6)]
这可以使用starmap
更简单地编写,map
的构建方式类似product
,尽管函数的参数(在本例中为>>> starmap(product,sorted(d.items()))
# iterates through [('a', 1), ('a', 2), ('a', 3)], [('b', 4), ('b', 5), ('b', 6)]
)来自元组。见doc
zippped
然后列表>>> zip(*starmap(product,sorted(d.items())))
[(('a', 1), ('b', 4)), (('a', 2), ('b', 5)), (('a', 3), ('b', 6))]
在一起。
{{1}}
答案 1 :(得分:0)
这是一种方式:
>>> d={'s1':{'a':[1,2,3],'b':[4,5,6]},'s2':{'d':[77,88,99],'e':[666,333,444]}}
>>> for k in sorted(d.keys()):
... v = d[k]
... for i in xrange(len(v.values()[0])):
... print k
... for k2 in sorted(v.keys()):
... v2 = v[k2]
... print "%s,%d" % (k2, v2[i])
... print "%s\n" % k
...
当我跑步时,它打印出来:
s1
a,1
b,4
s1
s1
a,2
b,5
s1
s1
a,3
b,6
s1
s2
d,77
e,666
s2
s2
d,88
e,333
s2
s2
d,99
e,444
s2