需要帮助理解 Ordereddict 的行为
Need help understanding behaviour of Ordereddict
我有一个星期几的有序字典:
weekdays = collections.OrderedDict([ ('Mon', 0), ('Tue', 0), ('Wed', 0), ('Thu', 0), ('Fri', 0), ('Sat', 0), ('Sun', 0) ])
我想将第 n 个键的值更改为 1,因此如果我将 n 设置为 4,则第 4 个键是 'Thu' 所以工作日变为:
OrderedDict([('Mon', 0), ('Tue', 0), ('Wed', 0), ('Thu', 1), ('Fri', 0), ('Sat', 0), ('Sun', 0)])
我可以用下面的代码做到这一点:
startday_2017 = 4
weekdays = collections.OrderedDict([ ('Mon', 0), ('Tue', 0), ('Wed', 0), ('Thu', 0), ('Fri', 0), ('Sat', 0), ('Sun', 0) ])
date = list(weekdays.keys())[(startday_2017-1)]
for key in weekdays.keys():
if key == date:
weekdays[key] = 1
这似乎可行,但如果我想更改与第 n 个键之前或之后的键对应的值,则 ordereddict 开始表现得很滑稽。使用此代码:
startday_2017 = 4
weekdays = collections.OrderedDict([ ('Mon', 0), ('Tue', 0), ('Wed', 0), ('Thu', 0), ('Fri', 0), ('Sat', 0), ('Sun', 0) ])
date = list(weekdays.keys())[(startday_2017-1)]
for key in weekdays.keys():
if key < date:
weekdays[key] = "applesauce"
elif key == date:
weekdays[key] = 1
else:
weekdays[key] = 2
print(weekdays)
我得到这个输出:
OrderedDict([('Mon', 'applesauce'), ('Tue', 2), ('Wed', 2), ('Thu', 1), ('Fri', 'applesauce'), ('Sat', 'applesauce'), ('Sun', 'applesauce')])
如何实现我想要的结果?
因为您进行的是词法比较而不是数字排序,'Tue' > 'Thurs'
:
您可能想要尝试的只是 enumerate()
键并使用数值,例如:
In []:
for i, key in enumerate(weekdays, 1):
if i < startday_2017:
weekdays[key] = "applesauce"
elif i == startday_2017:
weekdays[key] = 1
else:
weekdays[key] = 2
weekdays
Out[]:
OrderedDict([('Mon', 'applesauce'),
('Tue', 'applesauce'),
('Wed', 'applesauce'),
('Thu', 1),
('Fri', 2),
('Sat', 2),
('Sun', 2)])
我有一个星期几的有序字典:
weekdays = collections.OrderedDict([ ('Mon', 0), ('Tue', 0), ('Wed', 0), ('Thu', 0), ('Fri', 0), ('Sat', 0), ('Sun', 0) ])
我想将第 n 个键的值更改为 1,因此如果我将 n 设置为 4,则第 4 个键是 'Thu' 所以工作日变为:
OrderedDict([('Mon', 0), ('Tue', 0), ('Wed', 0), ('Thu', 1), ('Fri', 0), ('Sat', 0), ('Sun', 0)])
我可以用下面的代码做到这一点:
startday_2017 = 4
weekdays = collections.OrderedDict([ ('Mon', 0), ('Tue', 0), ('Wed', 0), ('Thu', 0), ('Fri', 0), ('Sat', 0), ('Sun', 0) ])
date = list(weekdays.keys())[(startday_2017-1)]
for key in weekdays.keys():
if key == date:
weekdays[key] = 1
这似乎可行,但如果我想更改与第 n 个键之前或之后的键对应的值,则 ordereddict 开始表现得很滑稽。使用此代码:
startday_2017 = 4
weekdays = collections.OrderedDict([ ('Mon', 0), ('Tue', 0), ('Wed', 0), ('Thu', 0), ('Fri', 0), ('Sat', 0), ('Sun', 0) ])
date = list(weekdays.keys())[(startday_2017-1)]
for key in weekdays.keys():
if key < date:
weekdays[key] = "applesauce"
elif key == date:
weekdays[key] = 1
else:
weekdays[key] = 2
print(weekdays)
我得到这个输出:
OrderedDict([('Mon', 'applesauce'), ('Tue', 2), ('Wed', 2), ('Thu', 1), ('Fri', 'applesauce'), ('Sat', 'applesauce'), ('Sun', 'applesauce')])
如何实现我想要的结果?
因为您进行的是词法比较而不是数字排序,'Tue' > 'Thurs'
:
您可能想要尝试的只是 enumerate()
键并使用数值,例如:
In []:
for i, key in enumerate(weekdays, 1):
if i < startday_2017:
weekdays[key] = "applesauce"
elif i == startday_2017:
weekdays[key] = 1
else:
weekdays[key] = 2
weekdays
Out[]:
OrderedDict([('Mon', 'applesauce'),
('Tue', 'applesauce'),
('Wed', 'applesauce'),
('Thu', 1),
('Fri', 2),
('Sat', 2),
('Sun', 2)])