根据条件从列表字典中的值创建列表

时间:2020-06-09 07:58:06

标签: python-3.8

我希望在以下字典列表中为每个唯一的到期日期创建一个list / np.array:

import datetime as dt

data=[{'expiry': dt.datetime(2020, 6, 26, 21, 0), 'strike': 137.0}, 
      {'expiry': dt.datetime(2020, 6, 26, 21, 0), 'strike': 137.25}, 
      {'expiry': dt.datetime(2020, 6, 26, 21, 0), 'strike': 137.5}, 
      {'expiry': dt.datetime(2020, 7, 24, 21, 0), 'strike': 136.5},
      {'expiry': dt.datetime(2020, 7, 24, 21, 0), 'strike': 137.0},
      {'expiry': dt.datetime(2020, 7, 24, 21, 0), 'strike': 137.5},
      {'expiry': dt.datetime(2020, 7, 24, 21, 0), 'strike': 138.0}]

我可以这样获得唯一的失效日期:

exp = np.unique([np.array([d['expiry']]) for d in data])

所需的输出是:

[[137.0, 137.25, 137.5], [136.5, 137.0, 137.5, 138.0]]

2 个答案:

答案 0 :(得分:2)

使用您的exp

[[y['strike'] for y in data if y['expiry']==x] for x in exp ]

输出:

[[137.0, 137.25, 137.5], [136.5, 137.0, 137.5, 138.0]]

答案 1 :(得分:1)

作为@AllaTarighati解决方案的替代方案,您还可以使用return_inverse的{​​{1}}选项:

np.unique

这是一个无需任何其他比较(exp,ind = np.unique([np.array([d['expiry']]) for d in data], return_inverse=True) strike = [[data[i]['strike'] for i,j in enumerate(ind) if j==k] for k in range(exp.size)] )的解决方案:

j==k

两个示例代码的exp,ind = np.unique([np.array([d['expiry']]) for d in data], return_inverse=True) strike = [[] for _ in range(exp.size)] for i,j in enumerate(ind): strike[j].append(data[i]['strike']) 输出为:

print(strike)