Python:创建已排序的键列表,将一个键移动到头部

Python:创建已排序的键列表,将一个键移动到头部,python,sorting,dictionary,exception,key,Python,Sorting,Dictionary,Exception,Key,有没有一种更像python的方法,可以通过将一个键移到头部来获得字典键的排序列表?到目前为止,我有: # create a unique list of keys headed by 'event' and followed by a sorted list. # dfs is a dict of dataframes. for k in (dict.fromkeys(['event']+sorted(dfs))): display(k,dfs[k]) # ideally this sh

有没有一种更像python的方法,可以通过将一个键移到头部来获得字典键的排序列表?到目前为止,我有:

# create a unique list of keys headed by 'event' and followed by a sorted list.
# dfs is a dict of dataframes.
for k in (dict.fromkeys(['event']+sorted(dfs))):
    display(k,dfs[k]) # ideally this should be (k,v)

我想你能做到

for k, v in list(dfs.items()) + [('event', None)]:

.items()
将字典强制转换为元组列表(或者从技术上讲是一个
dict_items
,这就是为什么我必须将其强制转换为list以显式追加),您可以将第二个列表追加到该列表。遍历元组列表允许自动解包(因此您可以在列表中执行
k,v
,而不是在列表中执行
tup

我们真正想要的是一个iterable,但这在排序时是不可能的,因为它必须先查看所有键,然后才能知道第一项应该是什么

使用dict.fromkeys按插入顺序创建空白字典非常聪明,但它依赖于当前python版本的实现细节。(迪克特从根本上说是无序的)我承认,我花了一段时间才弄明白那条线

由于您发布的代码只是使用键,因此我建议您将重点放在这一点上。占用更多的行以提高可读性是一件好事,特别是如果我们可以将其隐藏在可测试函数中:

def display_by_keys(dfs, priority_items=None):
    if not priority_items:
        priority_items = ['event']
    featured = {k for k in priority_items if k in dfs}
    others = {k for k in dfs.keys() if k not in featured}
    for key in list(featured) + sorted(others):
        display(key, dfs[key])
潜在的缺点是每次都必须对密钥进行排序。如果在大型数据集上这样做的频率比数据存储更改的频率要高得多,那么这是一个潜在的问题

当然,您不会显示一个非常大的结果,但是如果它成为一个问题,那么您将希望将它们存储在collections.OrderedDict()中,或者查找sorteddct模块

from collections import OrderedDict

# sort once
ordered_dfs = OrderedDict.fromkeys(sorted(dfs.keys()))
ordered_dfs.move_to_end('event', last=False)
ordered_dfs.update(dfs)

# display as often as you need
for k, v in ordered_dfs.items():
    print (k, v)

如果首先在不同的视图中显示不同的字段,这不是问题。只需对所有字段进行正常排序,并使用与上面类似的函数,而不进行排序。

是否需要键和值?使用d.items().PS:不要将变量命名为“dict”,因为这是类的名称。@KennyOstrom请再次查看。dict被用作类名。
dict.fromkeys
的好处是删除重复的
事件
key。啊,我的坏代码。将列表更改为已排序。首先是新条目。这不会删除现有的“事件”,但无论如何,这可能是一个不同的问题(我会使用过滤器)。使用@KennyOstrom建议,剩余的问题是
事件
是重复的:
对于[('event',dfs['event'])]]+排序(dfs.items()):显示(k,v)
不可能重复。dict.fromkeys()构建一个dict,根据定义,它从不包含dup.updated。对不起,我没有正确阅读您的原始代码。