将xyz值列表到字典

时间:2011-07-02 09:47:48

标签: python

我有一个清单:

list = [ '1', '1,'1', '-1','1','-1' ]

并需要将其转换为字典字典。前三个值是x y z,第二个三个值是x y z。结果应该是:

d = { 0:{x:1,y:1,z:1}, 1:{x:-1,y:1,z:-1}}

我的尝试:

mylist=[1,1,1,-1,1,-1]
count = 1
keycount = 0
l = {'x':' ','y':' ', 'z':' '}
t = {}
for one in mylist:
        if count == 1:
                l['x'] = one
                print l
        if count == 2:
                l['y'] = one
                print l
        if count == 3:
                l['z'] = one
                print l
                count = 0
                t[keycount] = l
                l = {}
                keycount += 1
        count = count + 1
print t

但结果却切换了字典中的一些键?有没有人有更好的解决方案?

4 个答案:

答案 0 :(得分:3)

有点复杂:

l = [ '1', '1', '1', '-1', '1', '-1' ]

dicts = [dict(zip(['x', 'y', 'z'], l[i:i+3])) for i in range(0, len(l), 3)]
result = dict(enumerate(dicts))

print result #prints {0: {'y': '1', 'x': '1', 'z': '1'}, 1: {'y': '1', 'x': '-1', 'z': '-1'}}

答案 1 :(得分:1)

字典项目无序。

但是,Python 2.7引入了OrderedDict,它保留了添加项目的顺序。

你可以这样做:

>>> from collections import OrderedDict
>>> d = {}
>>> k = ('x', 'y', 'z')
>>> for i,j in enumerate(range(0, len(mylist), 3)):
...     d[i] = OrderedDict(zip(k, l[j:j+3]))
...
>>> d
{0: OrderedDict([('x', '1'), ('y', '1'), ('z', '1')]), 1: OrderedDict([('x', '-1'), ('y', '1'), ('z', '-1')])}

但通常没有理由订购物品。无论如何,您都可以通过d[0]['x']访问该值,并且项目的顺序无关紧要。

但是,如果您想按顺序排列d中的项目,建议您使用list而不是字典。你的密钥只是数字,不需要字典。

答案 2 :(得分:0)

d = {}
for i in range(len(myList)/3):
    d[i] = {'x':myList[3*i], 'y':myList[3*i+1], 'z':myList[3*i+2]}

答案 3 :(得分:0)

对于Python 3:

>>> from itertools import cycle
>>>
>>> alist = ['1', '1', '1', '-1', '1', '-1']
>>>
>>> dict(enumerate(map(dict, zip(*[zip(cycle('xyz'), map(int, alist))] * 3))))
{0: {'y': 1, 'x': 1, 'z': 1}, 1: {'y': 1, 'x': -1, 'z': -1}}

我知道这太可怕了,但还是......