我有一个〜1000形式的对象字典:
d = {
'ID1': [[a1, b1, c1, d1, e1, f1], [g1, h1, i1]],
'ID2': [[a2, b2, c2, d2, e2, f2], [g2, h2, i2]],
}
键是字符串,而值是整数列表。
我想找到与以下三个差异中的每一个最大对应的字典键:(bγ - aγ)
,(dγ - cγ)
和(fγ - eγ)
,其中γ
是1:len(d)
中的int。
这样做有效/ pythonic的方式是什么?
答案 0 :(得分:1)
由于您的数据尚未排序,因此您需要对其进行暴力破解。但你可以做得更好一点:
diffs = [
(k, v[0][1] - v[0][0], v[0][3] - v[0][2], v[0][5] - v[0][4])
for k, v in d.items()
]
max(diffs, key=lambda t: t[1])[0] # b - a
答案 1 :(得分:0)
这似乎有效:
数据:
d={
'a0': [[3, 3, 5, 2, 3, 3], [1, 1, 1]],
'a1': [[1, 0, 1, 7, 5, 2], [1, 1, 1]],
'a2': [[4, 9, 8, 8, 2, 8], [1, 1, 1]],
'a3': [[5, 3, 4, 4, 9, 7], [1, 1, 1]],
'a4': [[5, 5, 6, 7, 9, 9], [1, 1, 1]],
'a5': [[8, 9, 7, 3, 1, 4], [1, 1, 1]],
'a6': [[0, 9, 3, 3, 9, 9], [1, 1, 1]],
'a7': [[3, 5, 1, 8, 7, 1], [1, 1, 1]],
'a8': [[3, 7, 0, 0, 0, 4], [1, 1, 1]],
'a9': [[6, 6, 4, 8, 0, 4], [1, 1, 1]]}
计算差异的函数:
def f(lst):
if lst:
a,b = lst.pop(),lst.pop()
l=f(lst)
l.append(a-b)
return l
else:
return []
分四步解决:
l1=[f(d[n][0][:]) for n in d.keys()]
l2=[[l[i] for l in l1] for i in range(3)]
l3=[l.index(max(l)) for l in l2]
l4=list(d.keys())
对于
print(l3,[l4[i] for i in l3])
[6, 7, 2] ['a6', 'a7', 'a2']
或带有pandas的3行:
d1={ n : d[n][0] for n in d.keys()} # prepare
df=pd.DataFrame(d1).T.diff(axis=1).loc[:,1::2] # sums
print(df.apply(pd.Series.argmax)) # indexes of max
对于:
1 a6
3 a7
5 a2
dtype: object
答案 2 :(得分:0)
或者你可以{d}做max
。
d = {
'ID1': [[0, 1, 2, 3, 4, 5], [1, 1, 1]],
'ID2': [[0, 2, 4, 6, 8, 10], [2, 2, 2]],
}
diff = lambda d: [j-i for i, j in zip(d[:-1], d[1:])]
new_d = {k: max(diff(v[0])) for k, v in d.items()}
my_max_key = max(new_d)