Python错误:字典在Leetcode中向后迭代

Python错误:字典在Leetcode中向后迭代,python,dictionary,debugging,Python,Dictionary,Debugging,我试图做这道题1313。在Leetcode上解压运行长度编码列表,我的代码在IDE上运行得很好,但是当我在Leetcode上提交它时,有时字典会向后迭代,导致输出列表的顺序相反。我95%确信我的代码是正确的,因为它通过了3-4个测试用例,然后字典在同一测试用例上反向迭代。这是一个bug,还是我的代码有问题?谢谢你的帮助 class Solution(object): def decompressRLElist(self, nums): """ :type

我试图做这道题1313。在Leetcode上解压运行长度编码列表,我的代码在IDE上运行得很好,但是当我在Leetcode上提交它时,有时字典会向后迭代,导致输出列表的顺序相反。我95%确信我的代码是正确的,因为它通过了3-4个测试用例,然后字典在同一测试用例上反向迭代。这是一个bug,还是我的代码有问题?谢谢你的帮助

class Solution(object):
    def decompressRLElist(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        d = {}
        l = []
        for i in range(0, len(nums), 2):
            d[nums[i+1]] = nums[i]
        print(d)
        for (k,v) in d.items():
            for j in range(v):
                l.append(k)
        return l

如果Leetcode运行Python3.5或更早版本,则字典实现是不有序的。看

在这里您不需要词典,无论如何,您可以完全删除词典:

class Solution(object):
    def decompressRLElist(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        l = []
        for i in range(0, len(nums), 2):
            k = nums[i+1]
            v = nums[i]
            for j in range(v):
                l.append(k)
        return l
事实上,您的字典解决方案是不正确的,因为相同的值可能在LRE中出现多次,长度不同;下面是一个简单的例子,可以说明这个问题:

[
    3, 42,
    2, 17,
    4, 42
]
这应扩大到:

[
    42, 42, 42,
    17, 17,
    42, 42, 42, 42
]
但是您的解决方案将输出不正确的结果,因为将输入放入字典
d
首先意味着您将对
{42:4,17:2}
进行操作,然后输出

[
    42, 42, 42, 42,
    17, 17
]

如果Leetcode运行Python3.5或更早版本,则字典实现是不有序的。看

在这里您不需要词典,无论如何,您可以完全删除词典:

class Solution(object):
    def decompressRLElist(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        l = []
        for i in range(0, len(nums), 2):
            k = nums[i+1]
            v = nums[i]
            for j in range(v):
                l.append(k)
        return l
事实上,您的字典解决方案是不正确的,因为相同的值可能在LRE中出现多次,长度不同;下面是一个简单的例子,可以说明这个问题:

[
    3, 42,
    2, 17,
    4, 42
]
这应扩大到:

[
    42, 42, 42,
    17, 17,
    42, 42, 42, 42
]
但是您的解决方案将输出不正确的结果,因为将输入放入字典
d
首先意味着您将对
{42:4,17:2}
进行操作,然后输出

[
    42, 42, 42, 42,
    17, 17
]

在python中,字典没有固定的顺序。您应该假设迭代dict或dict.items()的顺序是任意/随机的。@KevinWang不完全正确-Python v3.7+对
dict
有固定的顺序(通过插入)。然而,在Python 2中,低于3.6的Python 2和Python 3是任意排序的。@r.ook是的,我确实记得听说过,但我认为这只是C Python解释器中的一个实现细节,而不是Python语言的一部分。编辑我现在看到3.7使排序(从3.6开始出现)成为规范的正式部分。感谢您的更正。在python中,字典没有固定的排序。您应该假设迭代dict或dict.items()的顺序是任意/随机的。@KevinWang不完全正确-Python v3.7+对
dict
有固定的顺序(通过插入)。然而,在Python 2中,低于3.6的Python 2和Python 3是任意排序的。@r.ook是的,我确实记得听说过,但我认为这只是C Python解释器中的一个实现细节,而不是Python语言的一部分。编辑我现在看到3.7使订购(从3.6开始出现)成为规范的正式部分。感谢您的更正。