【问题标题】:In Python how to obtain a partial view of a dict?在 Python 中如何获取字典的部分视图?
【发布时间】:2015-04-26 14:11:30
【问题描述】:

是否有可能在 Python 中获得类似于 pandas df.tail()/df.head()dict 的部分视图。假设您有一个很长的dict,并且您只想检查dict 的一些元素(开头、结尾等)。比如:

dict.head(3)  # To see the first 3 elements of the dictionary.

{[1,2], [2, 3], [3, 4]}

谢谢

【问题讨论】:

  • "the beginning" 和 "the end" 对于 Python 字典没有意义,因为它们的顺序是任意的。
  • “前三个元素”是什么意思? dict 没有固有的键顺序感。
  • 你确定你没有混淆字典和列表吗?
  • 我的意思是,如果你在控制台上调用 dict 会出现前三个元素.....有时你这样做,如果 dict 很长,你会得到很多使您的所有控制台空间变得混乱的数据。
  • @iCodez 我明白了,但如果你只是想快速看一下字典的外观怎么办。

标签: python python-2.7 dictionary


【解决方案1】:

来自the documentation

CPython 实现细节:键和值列在一个 非随机的任意顺序,在 Python 中有所不同 实现,并且取决于字典的插入历史 和删除。

我充其量只是玩弄了其他 Python 实现(例如 PyPy、IronPython 等),所以我不确定是否所有 Python 实现都是这种情况,但 dict/ 的一般概念hashmap/hash/etc 是键是无序的。

话虽如此,您可以使用OrderedDict from the collections libraryOrderedDicts 记住您输入时的键顺序。

【讨论】:

  • 他在他的 cmets 中声明他已经知道这一点。他只需要一小部分 dict 内容。
【解决方案2】:

如果键是可排序的,您可以这样做:

head = dict([(key, myDict[key]) for key in sorted(myDict.keys())[:3]])

或许:

head = dict(sorted(mydict.items(), key=lambda: x:x[0])[:3])

其中x[0] 是每个键/值对的键。

【讨论】:

    【解决方案3】:

    有点奇怪的愿望,但你可以通过这个来实现

    dict(islice(mydict.iteritems(), 0, 2))
    

    或短字典

    # Python 2.x
    dict(mydict.items()[0:2])
    
    # Python 3.x
    dict(list(mydict.items())[0:2])
    

    【讨论】:

    • 或许dict(sorted(mydict.items()[:3])
    • 好吧,如果订单确实重要,是的。但据我了解,作者不需要那个。他只想要在打印字典时会在开头打印的元素,而这正是它的样子
    • .items()是一个迭代器,先转成列表,不然切片的时候会报错。
    • @user5061:不,OP 指定 Python 2.7。
    • # user 5061 在 python2 项目中返回列表。在 python3 中,您可以使用 islice 对迭代器进行切片。
    【解决方案4】:
    import itertools 
    def glance(d):
        return dict(itertools.islice(d.iteritems(), 3))
    
    >>> x = {1:2, 3:4, 5:6, 7:8, 9:10, 11:12}
    >>> glance(x)
    {1: 2, 3: 4, 5: 6}
    

    但是:

    >>> x['a'] = 2
    >>> glance(x)
    {1: 2, 3: 4, u'a': 2}
    

    请注意,插入一个新元素会以不可预知的方式改变“前”三个元素的内容。这就是人们告诉你字典没有排序时的意思。您可以根据需要获得三个元素,但您无法知道它们会是哪三个。

    【讨论】:

      【解决方案5】:

      我知道这个问题已经有 3 年历史了,但这里是 Python 3.* 的 Pythonic 版本(可能比上述方法更简单):

      [print(v) for i, v in enumerate(my_dict.items()) if i < n]
      

      它将打印字典my_dict的第一个n元素

      【讨论】:

      • 这仅在您的键通常是递增整数时才有效。如果您有负数、大数、字符串或日期怎么办?
      • @Wassadamo 为什么这不适用于任意键?
      • 你是对的。使用枚举索引而不是键
      【解决方案6】:

      对于那些宁愿用pandas 数据框解决这个问题的人。只需将您的字典 mydict 塞入数据框中,旋转它,然后获取前几行:

      pd.DataFrame(mydict, index=[0]).T.head()
      

      0 hi0 1 hi1 2 hi2 3 hi3 4 hi4

      【讨论】:

        【解决方案7】:

        使用 Python 3 字典理解的 @Neb 解决方案:

        {k: v for i, (k, v) in enumerate(my_dict.items()) if i < n}
        

        它返回一个字典而不是打印输出

        【讨论】:

          【解决方案8】:

          编辑:

          在 Python 3.x 中: 在不使用库的情况下,可以这样做。使用方法:

          .items()

          返回带有值的字典键列表。

          必须将其转换为列表,否则会发生错误'my_dict' object is not subscriptable。然后将其转换为字典。现在可以使用方括号进行切片了。

          dict(list(my_dict.items())[:3])
          

          【讨论】:

          • 您能否为您的答案提供一些背景信息,以便对其他人有用?
          • 现在是不是更容易理解了?
          【解决方案9】:

          一个快速而简短的解决方案可以是这样的:

          import pandas as pd
          
          d = {"a": [1,2], "b": [2, 3], "c": [3, 4]}
          
          pd.Series(d).head()
          
          a    [1, 2]
          b    [2, 3]
          c    [3, 4]
          dtype: object
          

          【讨论】:

          • 请注意,这会给你一个object 而不是dicthead = pd.Series(d).head() 之后的含义,这将不起作用:for name,group in head... 但这将:for name in head.keys(): # \n # group = head[name]
          【解决方案10】:
          list(reverse_word_index.items())[:10]
          

          将数字从 10 更改为您想要预览的字典 reverse_word_index 的任意数量

          【讨论】:

            【解决方案11】:

            这会返回一个字典:

            dict(list(my_dictname.items())[0:n])
            

            如果你只是想看一眼你的字典,那么就这样做:

            list(freqs.items())[0:n]
            

            【讨论】:

              【解决方案12】:

              字典中项目的顺序在 Python 3.7+ 中保留,所以这个问题是有道理的。

              要从一开始就获取只有 10 个项目的字典,您可以使用 pandas

              d = {"a": [1,2], "b": [2, 3], "c": [3, 4]}
              
              import pandas as pd
              result = pd.Series(d).head(10).to_dict()
              print(result)
              

              这将产生一个新的字典。

              【讨论】:

                【解决方案13】:
                d = {"a": 1,"b": 2,"c": 3}
                for i in list(d.items())[:2]:
                     print('{}:{}'.format(d[i][0], d[i][1]))
                
                a:1
                b:2
                

                【讨论】:

                • 1.需要'' 左右a, b, c。 2. 前两个元素是[:2]。 3. i 是一个元组。 4. 为什么不是 f 弦? 5.i, d[i] 不对,你需要i[0], i[1]。但是for k, v… print(f"{k}: {v}") 会更好。
                • (@JackDeeth 关于#4,问题标记为 python 2.7,f 字符串不正确。)这段代码试过了吗?正如已经提到的, .items() 返回一个元组。您要么想要 .keys() ,要么需要更改打印语句...
                猜你喜欢
                • 2021-05-11
                • 2021-05-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-10-30
                • 1970-01-01
                • 2021-07-12
                • 2016-08-20
                相关资源
                最近更新 更多