【问题标题】:Getting the n element of each list in a defaultdict获取默认字典中每个列表的第 n 个元素
【发布时间】:2018-02-27 19:11:04
【问题描述】:

我有一个defaultdict(list) 的:

d_int = defaultdict(type, {0: [1,2,3,4,5], 1: [6,7,8,9,10], 2: [11,12,13,14,15]})

有没有一种pythonic方法可以将每个列表中的每个n元素保存到一个新数组中,所以我有这样的东西?:

a = [1,6,11]
b = [2,7,12]
c = [3,8,13]
d = [4,9,14]
e = [5,10,15]

【问题讨论】:

  • 迭代字典的键,就像使用任何字典一样。这就是使用字典的 Pythonic 方式。
  • type 不是defaultdict 的有效default_factory 参数

标签: python numpy dictionary collections defaultdict


【解决方案1】:

字典不被认为是有序的。但是,获得所需输出的一种方法是构造 collections.OrderedDictcollections.defaultdict 对象,然后应用一些 zip 魔法:

from collections import OrderedDict, defaultdict

d_int = OrderedDict(sorted(defaultdict(list, {0: [1,2,3,4,5],
                           1: [6,7,8,9,10], 2: [11,12,13,14,15]}).items()))

dict(enumerate(zip(*d_int.values())))

# {0: (1, 6, 11), 1: (2, 7, 12), 2: (3, 8, 13), 3: (4, 9, 14), 4: (5, 10, 15)}

这种方法的好处是您不必提取字典及其组成列表的长度。此外,enumeratezip 都是高效的惰性函数。

【讨论】:

    【解决方案2】:

    以下代码将计算一个数组nth_el,比如nth_el[i]包含所有第i个元素:

    d_int = defaultdict(type, {0: [1,2,3,4,5], 1: [6,7,8,9,10], 2: [11,12,13,14,15]})
    
    nth_el = [[d_int[k][i] for k in range(3)] for i in range(5)]
    

    nth_el 的值:

    [[1, 6, 11], [2, 7, 12], [3, 8, 13], [4, 9, 14], [5, 10, 15]]
    

    【讨论】:

      【解决方案3】:

      示例输出几乎肯定是不切实际的;如果我们有相同类型的数据,请将其放入列表中。这是一个粗略的例子:

      >>> d_int = defaultdict(type, {0: [1,2,3,4,5], 1: [6,7,8,9,10], 2: [11,12,13,14,15]})
      >>> list(zip(*(v for k,v in sorted(d_int.items()))))
      [(1, 6, 11), (2, 7, 12), (3, 8, 13), (4, 9, 14), (5, 10, 15)]
      

      步骤如下:items从字典中提取key,value对。 sorted 然后按键对它们进行排序,v for k,v in 生成器表达式丢弃键,* 将值作为单独的参数分发给 zipzip 将它们转置。最后,list 从 zip 对象(可迭代)构建一个列表。

      【讨论】:

        猜你喜欢
        • 2014-04-14
        • 2023-03-08
        • 1970-01-01
        • 2020-01-05
        • 1970-01-01
        • 1970-01-01
        • 2021-10-05
        • 1970-01-01
        • 2020-01-10
        相关资源
        最近更新 更多