将项目放入字典而不更改顺序

时间:2016-03-28 14:05:03

标签: python

from collections import OrderedDict

l = [('Monkey', 71), ('Monkey', 78), ('Ostrich', 80), ('Ostrich', 96), ('Ant', 98)]

d = OrderedDict()
for i, j in l:
    d[i] = j
print d
OrderedDict([('Monkey', 78), ('Ostrich', 96), ('Ant', 98)])

预期的'd'应该是:

OrderedDict([('Monkey', (71,78)), ('Ostrich', (80,96)), ('Ant', 98)])

如果所有值都被组合或列出,则没问题。

3 个答案:

答案 0 :(得分:5)

不是每次都替换值,而是将其添加到元组:

>>> l = [('Monkey', 71), ('Monkey', 78), ('Ostrich', 80), ('Ostrich', 96), ('Ant', 98)]
>>> d = OrderedDict()
>>> for i, j in l:
...     if i in d:
...         d[i] += (j,)
...     else:
...         d[i] = (j,)
... 
>>> d
OrderedDict([('Monkey', (71, 78)), ('Ostrich', (80, 96)), ('Ant', (98,))])

BTW,因为tuple是不可变的,所以每个附加都会创建一个新对象。如果您使用list s。

,这会更有效

答案 1 :(得分:1)

以下是使用Clock.schedule_interval(filechooser._update_files, t)的方法:

groupby

答案 2 :(得分:1)

for i, j in l:
    if i in d:
        #d[i] = (lambda x: x if type(x) is tuple else (x,))(d[i])
        #Eugene's version:
        if not isinstance(d[i], tuple): 
             d[i] = (d[i],)
        d[i] += (j,)
    else:
        d[i] = j

给出以下内容。请注意,'Ant'中的98不是原始问题中的“tupled”。

OrderedDict([('Monkey', (71, 78)), ('Ostrich', (80, 96)), ('Ant', 98)])