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

create list from values in list dicts based on condition

我希望为以下字典列表中的每个唯一到期日期创建一个 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]]

使用您的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]]

作为@AllaTarighati 解决方案的替代方案,您还可以使用 np.uniquereturn_inverse 选项:

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) 输出是:

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