【问题标题】:Sorting by the values of a sub-dictionary and then by primary keys按子词典的值排序,然后按主键排序
【发布时间】:2014-04-07 09:50:07
【问题描述】:

这段代码给出了我想要的输出。我想知道是否有更有效的方法来获得相同的输出。看来我在这条路上走的是风景优美的路线。对于这个例子,我打印出结果,我的真实数据被写入一个文本文件。

# using a dict with a sub-dict as its values, sort, format, and print out as delimited output suitable to import into Excel

tmpList = []

dict_1 = {'key_b1': {'val3': 'val_b3', 'val1': 'val_b1', 'val2': 'val_b2'}, 'key_a1': {'val3': 'val_a3', 'val1': 'val_a1', 'val2': 'val_a2'}, 'key_e1': {'val3': 'val_e3', 'val1': 'val_e1', 'val2': 'val_e2'}, 'key_d1': {'val3': 'val_d3', 'val1': 'val_d1', 'val2': 'val_d2'}, 'key_c1': {'val3': 'val_c3', 'val1': 'val_c1', 'val2': 'val_c2'}}

"""
# same dictionary as above but formatted for readability
dict_1 =
{
'key_b1': {'val3': 'val_b3', 'val1': 'val_b1', 'val2': 'val_b2'},
'key_a1': {'val3': 'val_a3', 'val1': 'val_a1', 'val2': 'val_a2'},
'key_e1': {'val3': 'val_e3', 'val1': 'val_e1', 'val2': 'val_e2'},
'key_d1': {'val3': 'val_d3', 'val1': 'val_d1', 'val2': 'val_d2'},
'key_c1': {'val3': 'val_c3', 'val1': 'val_c1', 'val2': 'val_c2'}
}
"""

# turn dictionary into a list with sublists
for k, v in dict_1.iteritems():
    tmpList.append([k, [v.values()[0], v.values()[1], v.values()[2]]])
print tmpList, '\n\n'
"""
# result of turning dict_1 into a list with sublists, only printed for those that might need some insight
[
['key_e1', ['val_e3', 'val_e2', 'val_e1']],
['key_b1', ['val_b3', 'val_b2', 'val_b1']],
['key_d1', ['val_d3', 'val_d2', 'val_d1']],
['key_a1', ['val_a3', 'val_a2', 'val_a1']],
['key_c1', ['val_c3', 'val_c2', 'val_c1']]
]
"""

# sort each sublist by members, and then sort by outer members
sort_sublists = [[k, sorted(l)] for k, l in tmpList]
sort_outer_lists = sorted(sort_sublists)

# print out in a comma delimited format
for d in sort_outer_lists:
    print d[0] + ',' + d[1][0] + ',' + d[1][1] + ',' + d[1][2]

"""
# final desired results
key_a1,val_a1,val_a2,val_a3
key_b1,val_b1,val_b2,val_b3
key_c1,val_c1,val_c2,val_c3
key_d1,val_d1,val_d2,val_d3
key_e1,val_e1,val_e2,val_e3
"""

【问题讨论】:

    标签: sorting python-2.7 dictionary key-value


    【解决方案1】:

    您可以使用列表推导式吗?

    [[k, v.values()] for k, v in dict_1.iteritems()]
    

    它似乎做你想做的事

    >>> [[k, v.values()] for k, v in dict_1.iteritems()] 
    [
     ['key_e1', ['val_e3', 'val_e2', 'val_e1']],
     ['key_b1', ['val_b3', 'val_b2', 'val_b1']],
     ['key_d1', ['val_d3', 'val_d2', 'val_d1']],
     ['key_a1', ['val_a3', 'val_a2', 'val_a1']],
     ['key_c1', ['val_c3', 'val_c2', 'val_c1']]
    ]
    

    编辑:要按字典键对内部列表值和外部列表进行排序,您可以使用内置的 sorted() 函数。例如

    >>> sorted([[k, sorted(v.values())] for k, v in dict_1.iteritems()]) 
        [
         ['key_a1', ['val_a1', 'val_a2', 'val_a3']],
         ['key_b1', ['val_b1', 'val_b2', 'val_b3']],
         ['key_c1', ['val_c1', 'val_c2', 'val_c3']],
         ['key_d1', ['val_d1', 'val_d2', 'val_d3']],
         ['key_e1', ['val_e1', 'val_e2', 'val_e3']]
        ]
    

    【讨论】:

    • Hmmmmm... 可以通过 for 循环替换运行 dict_1,然后我可以使用我编写的两个排序例程。这有点短。
    • 列表的哪一部分需要排序?字典值或键的列表?
    • 两者,首先是每个子列表的成员,然后是外部成员,这将是字典主键。
    【解决方案2】:

    如果您使用的是 python 2.7 或更高版本,则可以使用OrderedDict。它是集合模块的一部分并记住它的插入顺序:

    >>> from collections import OrderedDict
    >>> d = OrderedDict()
    >>> dict_1 = {'key_b1': {'val3': 'val_b3', 'val1': 'val_b1', 'val2': 'val_b2'}, 'key_a1': {'val3': 'val_a3', 'val1': 'val_a1', 'val2': 'val_a2'}, 'key_e1': {'val3': 'val_e3', 'val1': 'val_e1', 'val2': 'val_e2'}, 'key_d1': {'val3': 'val_d3', 'val1': 'val_d1', 'val2': 'val_d2'}, 'key_c1': {'val3': 'val_c3', 'val1': 'val_c1', 'val2': 'val_c2'}}
    >>> for k in sorted(dict_1.keys()):
    ...    d[k]=OrderedDict(sorted(dict_1[k].items(), key=lambda t: t[1]))
    ...
    >>> print '\n'.join([item[0]+','+','.join(item[1]) for item in d.items()])
    key_a1,val1,val2,val3
    key_b1,val1,val2,val3
    key_c1,val1,val2,val3
    key_d1,val1,val2,val3
    key_e1,val1,val2,val3
    >>>
    

    【讨论】:

    • 对每个子列表的成员进行排序,即以'val'为前缀的数据表示字典值,而不是以'key'为前缀的数据(原始字典主键)。至少这是我得到的。
    • 抱歉,忘记d = OrderedDict()
    猜你喜欢
    • 1970-01-01
    • 2014-01-18
    • 2011-12-06
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 2021-11-22
    • 1970-01-01
    相关资源
    最近更新 更多