在Python中遍历字典,值为列表

1 投票
10 回答
4189 浏览
提问于 2025-04-17 11:06

假设你有一个字典,长得像这样:

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)

撰写回答