我正在尝试将列表列表转换为字典字典。它有效但不完美

时间:2014-06-10 04:56:16

标签: python dictionary

这是我尝试转换的列表(任意数字):

[['2 4', '18', '4', '32', '2'], ['2 4', '13', '9', '12', '4'], ['3 7', '435', '2
3', '123', '4', '3', '234', '34']]

这是它返回的字典(关闭,但不完全)。注意值是如何乱序的。我需要它们与列表的顺序相同:

{0: {'2': 0, '18': 0, '32': 0, '2 4': 0, '4': 0}, 1: {'9': 0, '13': 0, '12': 0,
'2 4': 0, '4': 0}, 2: {'23': 0, '34': 0, '3': 0, '123': 0, '4': 0, '234': 0, '43
5': 0, '3 7': 0}}

最后,这是我用来转换它的代码:

iterator = 0 
myDict = {} 

for listItem in myList: 
    for item in listItem[1:]: 
        myDict[iterator] = dict.fromkeys(listItem, 0) 
iterator +=1 

编辑:我忘了提到我试图从相应的字典中删除每个列表中的第一个项目。

1 个答案:

答案 0 :(得分:5)

在python中,dicts本质上是无序的。这是因为它们通常通过hash tables实现,这比简单的关联数组更有效。相反,你应该使用OrderedDict,它就像一个字典,但也记得订单:

from collections import OrderedDict

iterator = 0 
myDict = OrderedDict()

for listItem in myList:
    myDict[iterator] = OrderedDict.fromkeys(listItem[1:], 0)
    iterator += 1

注意: 这里没有理由使用内部for循环以及fromkeys;您只是首先添加了整个listItem列表,因为您根本没有使用item。如果您想使用item,则只需使用普通作业,就必须执行此操作,而不使用fromkeys

from collections import OrderedDict

iterator = 0 
myDict = OrderedDict()

for listItem in myList:
    myDict[iterator] = OrderedDict()
    for item in listItem[1:]
        myDict[iterator][item] = 0
    iterator += 1

作为最后一点,python为您提供了很好的工具,以便您可以使用生成器表达式和enumerate将整个内容编写为单行:

myDict = OrderedDict((i, OrderedDict.fromkeys(listItem[1:], 0))
                     for i, listItem in enumerate(myList))