根据条件从列表字典中的值创建列表
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.unique
的 return_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]]
我希望为以下字典列表中的每个唯一到期日期创建一个 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.unique
的 return_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]]