【问题标题】:Dictionary comprehension inside insert() method not workinginsert()方法中的字典理解不起作用
【发布时间】:2021-10-20 08:24:01
【问题描述】:

我正在创建一个MappingList 类,它是一个实现为OrderedDict 的列表。

这是MappingList 类(省略了一些方法):

class MappingList(MutableSequence):
    """
    A MappingList is a regular list implemented as a dictionary
    """

    def __repr__(self):
        return str(list(self.seq.values()))

    def __getitem__(self, item):
        try:
            return self.seq[item]
        except KeyError:
            _traceback_from_none(IndexError, "list index out of range")

    def __setitem__(self, key, value, *, usage=None):
        if key > max(self.seq.keys()) and usage != "append":
            raise IndexError("list index out of range")
        self.seq[key] = value

    def __delitem__(self, key):
        try:
            del self.seq[key]
        except KeyError:
            _traceback_from_none(IndexError, "list index out of range")

    def __len__(self):
        return len(self.seq)

    def __eq__(self, other):
        if not isinstance(other, MappingList):
            return NotImplemented
        return self.seq == other.seq

    @classmethod
    def _dict_from_seq(cls, seq):
        return OrderedDict(enumerate(seq))

    def _next_available_slot(self):
        return max(self.seq) + 1

    def insert(self, index, value):  # todo: insert() should not overwrite
        """Insert a value into the MappingList"""
        if index > max(self.seq.keys()):
            raise IndexError("list index out of range")

        for k, v in {k: v for k, v in self.seq.items() if k > index}:
            del self.seq[k]
            self.seq[k + 1] = v

        self[index] = value

当我尝试将项目插入MappingList 时,我收到以下错误:

  File "C:\...\My Python Programs\free_time\mappinglist.py", line 103, in test_insert
    self.li.insert(1, MappingList(["blah", 1, 5.8]))
  File "C:\...\My Python Programs\free_time\mappinglist.py", line 85, in insert
    for k, v in {k: v for k, v in self.seq.items() if k > index}:
TypeError: cannot unpack non-iterable int object

为什么会发生这个错误? OrderedDict.items() 是否返回整数?

【问题讨论】:

  • 只是一个建议,但这就是为什么尝试编写这样的复杂结构是有问题的。将两者分开可以明确哪个部分不正确,并且可以更轻松地打印中间结果和/或设置断点。

标签: python python-3.x dictionary dictionary-comprehension


【解决方案1】:

因此不会发生错误。

当您不提供keys(), values(), items() 时,python 默认会遍历键。您需要提供items() 来告诉python 获取键和值。

for k, v in {k: v for k, v in self.seq.items() if k > index}.items(): 

【讨论】:

  • 哦,是的!我完全忘了加.items()
猜你喜欢
  • 2019-03-29
  • 2019-02-24
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 2014-12-26
  • 1970-01-01
相关资源
最近更新 更多