从重复的键列表创建字典

时间:2019-07-05 09:31:11

标签: python dictionary

arrival=[1,2,2,2,3,4]
duration=[5,1,2,3,1,90]

我想以此创建一个字典,所以应该是:

d={1:5,2:1,3:1,4:90}

因此对于重复的键= 2,应选择最小值= 1

我的代码是:

d = {}
for i in range(0,len(arrival)):
    d[arrival[i]] = duration[i]

for key,val in d.items():
    print(key,val)

但是这将获取重复键的最后一个值而不是最小值。

获得的结果:

d={1:5,2:3,3:1,4:90}

预期结果:

d={1:5,2:1,3:1,4:90}

4 个答案:

答案 0 :(得分:3)

我这样做的方法是使用itertools.groupbyduration中的每个组在arrival中找到最小值,并根据结果构建字典:

from itertools import groupby 

it_arrival = iter(arrival)
mins = [min(v) for _,v in groupby(duration, key=lambda _: next(it_arrival))]
dict(zip(set(arrival), mins))
# {1: 5, 2: 1, 3: 1, 4: 90}

答案 1 :(得分:2)

简单地(没有其他汇总/分组):

arrival = [1,2,2,2,3,4]
duration = [5,1,2,3,1,90]
d = {}

for i, k in enumerate(arrival):
    if k not in d or d[k] > duration[i]:
        d[k] = duration[i]

print(d)

输出:

{1: 5, 2: 1, 3: 1, 4: 90}

答案 2 :(得分:0)

创建一个新字典,在字典中检查是否存在到达钥匙, 如果存在,则将值更新为现有值和密钥值的最小值, 否则不存在密钥,然后在该字典中添加密钥对

arrival=[1,2,2,2,3,4]
duration=[5,1,2,3,1,90]

res ={}

for i, v in zip(arrival, duration):
    if i in res.keys():
        res[i] = min(res[i], v)
    else:
        res.update({i:v})


print(res)

输出

 {1: 5, 2: 1, 3: 1, 4: 90}

答案 3 :(得分:0)

这可以通过使用groupby函数的Pandas库和使用min条件进行汇总来轻松完成。

import pandas as pd

arrival=[1,2,2,2,3,4]
duration=[5,1,2,3,1,90]

df = pd.DataFrame({'arrival': arrival, 'duration': duration})

df = df.groupby(['arrival']).aggregate({'duration': 'min'})

data = df.to_dict()['duration']
[In]: data
[Out]:
{1: 5, 2: 1, 3: 1, 4: 90}