输出顺序不正确

时间:2019-01-17 15:24:24

标签: python python-3.x python-2.7 dictionary

我在python2.7中有一个代码,该代码获取一行文本作为其列表元素,并将其作为json返回。这是代码:

import itertools

lines=["Hamlet"
   ,"William Shakespeare",
   "Edited Barbara B Mowat Paul Werstine"
   ,"Michael Poston Rebecca Niles"]
LinesMap=dict()
for line in lines:
    list=[l for l in line.split(' ')]
    d = dict(itertools.izip_longest(*[iter(list)] * 2, fillvalue=None))
    LinesMap.update(d)

print(LinesMap)

输出为:

{'William': 'Shakespeare', 'Edited': 'Barbara', 'B': 'Mowat',    

'Michael':'Poston', 'Paul': 'Werstine', 'Rebecca': 'Niles', 'Hamlet': None}

应为:

{'Hamlet': None, 'William': 'Shakespeare', 'Edited': 'Barbara', 

'B':'Mowat', 'Paul': 'Werstine', 'Michael': 'Poston', 'Rebecca': 'Niles'}

如果我把清单加长,那就更糟了!为什么这顺序不正确?但是当我使用python3语法在python3.6中运行相同的代码时,顺序正确。 python3.6代码是:

import itertools

lines=["Hamlet"
   ,"William Shakespeare",
   "Edited Barbara B Mowat Paul Werstine"
   ,"Michael Poston Rebecca Niles"]
LinesMap=dict()
for line in lines:
   list=[l for l in line.split(' ')]
   d = dict(itertools.zip_longest(*[iter(list)] * 2, fillvalue=None))
   LinesMap = {**LinesMap, **d}

print(LinesMap) 

这是一个问题。另一个是对于短列表来说还可以,并且可以正常运行。但是,当列表较长且包含太多元素时,输出将不显示任何内容,并且似乎已损坏。这在Windows和Linux中都不会损坏。有什么问题吗?

ps:出于某些原因,我必须在python 2.7中运行它!

1 个答案:

答案 0 :(得分:4)

Python dict对象没有内在的顺序,除非在最新版本的Python中,所以不能假设将对象放入的顺序相同。

如果需要该功能,可以使用一个OrderedDict对象。

import random
from collections import OrderedDict

# Normal dict behavior:
numbers = {}
random_nums = (random.random() for _ in range(1000))
for i in random_nums:
    numbers[i] = random.random()
assert list(numbers.keys()) != list(random_nums)

# Ordered dict behavior:
numbers = OrderedDict()
for i in random_nums:
    numbers[i] = random.random()
assert list(numbers.keys()) == list(random_nums)