我在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中运行它!
答案 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)