假设您有一个字典,如下所示:
d = { 'a': ['s','b'], 'b': ['x1','y1','z1'] }
我怎样才能产生以下输出:
s, x1, b, y1, z1
由于
答案 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
如果您想要更多有用的答案,请澄清您的问题。