Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用整数作为键的Python dict会自然排序吗?_Python_Dictionary_Integer_Key_Sorted - Fatal编程技术网

用整数作为键的Python dict会自然排序吗?

用整数作为键的Python dict会自然排序吗?,python,dictionary,integer,key,sorted,Python,Dictionary,Integer,Key,Sorted,如果我创建了一个使用整数作为键的Python dict,我可以安全地假设迭代dict将根据键值顺序检索项吗 i、 e.遗嘱 my_dict = {} for x in range(0,100): my_dict[x] = str(x) for item in my_dict.items(): print item 是否总是按键值顺序打印列表?如果要按顺序进行迭代,请始终进行排序。我不这么认为。您必须使用collections.OrderedDict以确保订购。但是,这将按照条目添加的

如果我创建了一个使用整数作为键的Python dict,我可以安全地假设迭代dict将根据键值顺序检索项吗

i、 e.遗嘱

my_dict = {}
for x in range(0,100):
  my_dict[x] = str(x)

for item in my_dict.items():
  print item

是否总是按键值顺序打印列表?

如果要按顺序进行迭代,请始终进行排序。

我不这么认为。您必须使用
collections.OrderedDict
以确保订购。但是,这将按照条目添加的顺序对条目进行排序。

否,Python字典没有固有的顺序,不管键值如何。如果您需要排序,请坚持使用数组或列表,或者更好的方法-查看
pandas
,这将允许字典通过键值调用类似的功能,以及许多其他强大的功能()

简言之,没有。我敢打赌您注意到字典使用键的散列作为数组的索引,并且由于int散列到它们自己的值,因此您推断如果插入的值是整数,则插入的值将按键顺序结束。虽然这句话的前两部分是正确的,但推论不是正确的,即使是作为一个未记录的副作用。dict键是从键的散列中派生出来的,但不是完整的散列。这意味着即使使用整型键,您仍然可以得到无序插入,因为两个值可能在同一位置发生冲突(或者甚至具有“无序”散列派生值),从而导致在dict中无序插入键


基本上,可以将其视为dict的内部存储阵列中的索引,该索引是来自密钥散列的一些低阶位。仅仅因为一个数字比另一个大并不意味着由它的截断低阶位构建的值会更大,甚至不同;它们是散列表

Python附带collections.OrderedDict,但这是按插入顺序排序,而不是按键顺序排序

以下是两个按键排序的类似字典的模块:

有人说,平均而言,treaps比红黑树快,但红黑树在运行时间上的标准偏差较低。其他人对此提出质疑,尽管在我的测试中,前者被证明是正确的

treaps和红黑树几乎在O(logn)时间内完成所有工作,但它们的钥匙始终保持有序。对于大多数操作,Python字典都是O(1)。然而,对于treaps和红黑树,将所有键按顺序排列是O(n),而对于字典则是O(nlogn)

你应该什么时候用哪个

  • 如果你在一个循环中排序,你最好使用一个treap 或红黑树
  • 如果您在程序结束时进行一次排序, 你最好还是用list=list(dict);list.sort()
  • 如果您要保留输入的顺序,比如从配置文件 或者别的什么,你最好还是有秩序地去做

  • HTH

    我参加聚会已经很晚了,但是如果你和我一样,通过[你最喜欢的搜索引擎]偶然发现了这个页面,我愿意告诉你这个好消息:

    虽然Python dict永远不会自然排序,但将它们当作自然排序来使用是很简单的。假设您的键实际上是整数,只需将您最喜欢的dict,
    D
    传递给
    排序的
    内置命令,如下所示:

    for index, item in sorted(D.items()):
        print("index:", index, "item:", item)
    
    D.items()
    返回一个类
    dict\u items
    ,该类带有
    \uuuuuuuuuuuuuuuuuuuuuu
    方法,该方法在被
    for
    in
    语句调用时,返回一个迭代器,生成键值对,可以像任何其他iterable一样进行迭代

    sorted
    获取迭代器并返回一个列表,因此如果
    D={1:“alpha”,3:“charlie”,2:“bravo”}
    ,那么
    sorted
    返回的是排序列表
    [(1,“alpha”),(2,“bravo”),(3,“charlie”)]

    还可以按特定元素进行排序:

    sorted(D.items(), key=lambda x: x[1])
    
    或者通过某种其他任意、甚至不确定的排序标准:

    sorted(D.items(), lambda _: random.randint(0, 100))
    

    从dict构造列表在时间和空间上都是一个操作O(n),Python的排序算法Timsort非常有效(在平均情况下是O(n log n)),因此在绝大多数实际用例中,运行时性能不值得担心。

    为什么
    pandas
    当内置
    集合时。OrderedDict
    会很好?OrderedDict保持插入顺序,而不是按键值排序。