使用数组中的分组列创建dict,并将其余列分配给dict

时间:2017-11-03 20:09:40

标签: python arrays dictionary

我有type(s1) = numpy.ndarray。我想通过使用s1的第一列作为键来创建字典,并将其作为键的值。第一列有重复的值。 这是np.array。

s1 = np.array([[1L, 'R', 4],
       [1L, 'D', 3],
       [1L, 'I', 10],
       [1L, 'K', 0.0],
       [2L, 'R', 11],
       [2L, 'D', 13],
       [2L, 'I', 1],
       [2L, 'K', 6],
       [3L, 'R', 12],
       [3L, 'D', 17],
       [3L, 'I', 23],
       [3L, 'K', 10]], dtype=object)

我想得到以下内容:

{'1':[['R',4],['D',3],['I',10],['K',0]],
  '2':[['R',11],['D',13],['I',1],['K',6]],
  '3':[['R',12],['D',17],['I',23],['K',10]]}

这是我尝试过的:

In [18]: {x[0]:[x[1],x[2]] for x in s1}
Out[18]: {1L: ['K', 0.0], 2L: ['D', 6], 3L: ['K', 10]}

我看到分组列有重复值的问题。但我无法做到追加。我错过了什么诀窍?

2 个答案:

答案 0 :(得分:2)

您只需使用defaultdict

构建它们即可
     val dataset = spark
      .read
      .format("parquet")
      .option("basePath", hdfsInputBasePath)
      .load(hdfsInputPath)

d=collections.defaultdict(list)
for k,*v in s1 : d[k].append(list(v))

修改

您可以在dicts中嵌套dicts:

defaultdict(list,
            {1: [['R', 4], ['D', 3], ['I', 10], ['K', 0.0]],
             2: [['R', 11], ['D', 13], ['I', 1], ['K', 6]],
             3: [['R', 12], ['D', 17], ['I', 23], ['K', 10]]}) 

请参阅here进行概括。

答案 1 :(得分:1)

您可能想要使用itertools.groupby()

In [15]: {k: [list(x[1:]) for x in g]
   ....:  for k,g in itertools.groupby(s1, key=lambda x: x[0])}
Out[15]: 
{1L: [['R', 4], ['D', 3], ['I', 10], ['K', 0.0]],
 2L: [['R', 11], ['D', 13], ['I', 1], ['K', 6]],
 3L: [['R', 12], ['D', 17], ['I', 23], ['K', 10]]}