在Python中遍历字典,值为列表
假设你有一个字典,长得像这样:
d = { 'a': ['s','b'], 'b': ['x1','y1','z1'] }
你想要得到这样的输出:
s, x1, b, y1, z1
谢谢!
10 个回答
4
我觉得他想要的是先打印字典中不同值的第一个元素,然后是第二个,依此类推,直到达到列表中的最小值。然后,他就打印剩下的部分。
d={'a':['s','b'],'b':['x1','y1','z1']}
min = len(d['a']) if (len(d['a']) < len(d['b']) ) else len(d['b'])
for i in range(0,min):
p = d.keys()
print d[p[0]][i], d[p[1]][i],
print d['b'][min:][0]
5
虽然我对添加这些东西不是特别兴奋,但这至少能让你得到想要的结果。
keys = sorted(d.keys())
total = max([len(v) for v in d.values()])
output = []
for i in xrange(total):
for key in keys:
try: output.append(d[key][i])
except IndexError: pass
>>> output
['s', 'x1', 'b', 'y1', 'z1']
8
from itertools import izip_longest
d = { 'a': ['s','b'], 'b': ['x1','y1','z1'] }
print([i for t in izip_longest(*[d[k] for k in sorted(d)])
for i in t if i is not None])
(注意:izip_longest
在 Python 3 中被改名为 zip_longest
。)
解释:
izip_longest
会为每一组元素创建一个元组,比如第一组元素、第二组元素等等。在这个例子中,结果是 [('s', 'x1'), ('b', 'y1'), (None, 'z1')]
。接下来,它会创建一个列表,同时过滤掉 None
的值。
在这里你需要使用 izip_longest
,而不是简单的 zip
,否则结果就会变成 [('s', 'x1'), ('b', 'y1')]
。
带有中间步骤:
sorted_lists = [d[k] for k in sorted(d)]
tuples = izip_longest(*sorted_lists)
result = [i for t in tuples for i in t if i is not None]
print(result)