迭代字典,列表作为python中的值

时间:2012-01-26 00:32:28

标签: python

假设您有一个字典,如下所示:

d = { 'a': ['s','b'], 'b': ['x1','y1','z1'] }

我怎样才能产生以下输出:

s, x1, b, y1, z1

由于

10 个答案:

答案 0 :(得分:6)

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])

(N.B。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)

答案 1 :(得分:4)

虽然我没有引起追加和诸如此类的事情,但这至少可以得到你的确切结果。

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']

答案 2 :(得分:3)

我认为他想要的是首先打印dict&中不同值的所有 first 元素。然后是第二个,依此类推,直到达到列表的最小值。然后,他只打印剩余的。

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]

答案 3 :(得分:2)

我无法相信对这样一个模糊的问题有这么多答案!但话又说回来,我不会更好。 :-)我的第一个想法是使用izip_longest已经完成的方式,但我并不喜欢使用None作为特殊值 - 如果None是列表中的元素,那该怎么办呢?

相反,假设“标准解释”,如何:

>>> d = {'a': ['s', 'b'], 'b': ['x1', 'y1', 'z1']}
>>> [x[2] for x in sorted((i,k,v) for k in d for i,v in enumerate(d[k]))]
['s', 'x1', 'b', 'y1', 'z1']

这只要求密钥可以排序,如果不是,那么我们就错了。

(好吧,说实话,我第一次提出了zip(*sorted(chain(*(enumerate(d[k]) for k in sorted(d)))))[1],但我最近一直在使用itertools,并且根据自己的喜好有太多的括号。)

答案 4 :(得分:1)

也许zip() http://docs.python.org/library/functions.html#zip可以帮到你(我知道这不是你想要的,但也许你会发现如何得到正确的结果:

>>> zip(*d.values())
[('s', 'x1'), ('b', 'y1')]

答案 5 :(得分:1)

你的问题对我来说有点不清楚,但你想要实现这个目标

>>> d = { 'a': ['s','b'], 'b': ['x1','y1','z1'] }
>>> data = []
>>> for value in d.values():
...      for val in value:
...           data.append(val)
...
>>> data
['s', 'b', 'x1', 'y1', 'z1']

答案 6 :(得分:0)

result = []
d = { 'a':['s','b'], 'b':['x1','y1','z1'] }

result.append(d['a'][0])
result.append(d['b'][0])
result.append(d['a'][1])
result.append(d['b'][1])
result.append(d['b'][2])
print(result)

那会给你你想要的答案。我不确定你特别想要什么。

答案 7 :(得分:0)

如果我正确读到这个:

 result = []
 for x in d.values():
     for y in x:
          result.append(y)
 return result

当然,这假设d中的每个值都是可迭代的。

答案 8 :(得分:0)

>>> print ",".join([d['a'][0],d['b'][0],d['a'][1],d['b'][1],d['b'][2]])
s,x1,b,y1,z1

在不了解您的问题的情况下,无法帮助您。当然有很好的输出方式

如果您想要按键和值的顺序,可以尝试以下内容:

>>> tuples=[tuple([k]+d[k]) for k in d]
>>> tuples.sort()
>>> tuples
[('a', 's', 'b'), ('b', 'x1', 'y1', 'z1')]
>>> tuples_without_keys=[i[1:] for i in tuples]
>>> tuples_without_keys
[('s', 'b'), ('x1', 'y1', 'z1')]
>>> import itertools
>>> ans=itertools.izip_longest(*tuples_without_keys)
>>> ans=list(ans)
>>> ans
[('s', 'x1'), ('b', 'y1'), (None, 'z1')]
>>> [i for k in ans for i in k if i is not None]
['s', 'x1', 'b', 'y1', 'z1']

答案 9 :(得分:0)

这个答案就像OP的问题一样懒惰,含糊,有用。

此外,这有点像家庭作业的问题;如果是的话,应该在问题中提及。

import random
d = { 'a': ['s','b'], 'b': ['x1','y1','z1'] }
output = d['a']+d['b']
while output != ['s','x1','b','y1','z1']:
    random.shuffle(output)
print output

如果您想要更多有用的答案,请澄清您的问题。

相关问题