如何从列表中检索最小唯一值?

oiopk7p5  于 2021-06-25  发布在  Mysql
关注(0)|答案(4)|浏览(207)

我有一份字典目录。我希望每个唯一的api只有一个结果,结果需要根据优先级显示:0、1、2。我可以知道我该怎么做吗?
数据:

[
{'api':'test1', 'result': 0},
{'api':'test2', 'result': 1},
{'api':'test3', 'result': 2},
{'api':'test3', 'result': 0},
{'api':'test3', 'result': 1},
]

预期产量:

[
{'api':'test1', 'result': 0},
{'api':'test2', 'result': 1},
{'api':'test3', 'result': 0},
]
rjee0c15

rjee0c151#

不像别人那么干净的解决方案,但我觉得循序渐进,通俗易懂一点

l = [
{'api':'test1', 'result': 0},
{'api':'test2', 'result': 1},
{'api':'test3', 'result': 2},
{'api':'test3', 'result': 0},
{'api':'test3', 'result': 1},
]

j = {'api':[], 'result':[]}
for i in l:
    if i['api'] not in j['api']:
        j['api'].append(i['api'])
        j['result'].append(i['result']) 
    else:    
        index = j['api'].index(i['api'])

        if j['result'][index]>i['result']:
            j['result'][index] = i['result']

result = []

for i in range(len(j['api'])):
        result.append({'api':j['api'][i],'result':j['result'][i]})

print(result)

输出

[{'api': 'test1', 'result': 0},
 {'api': 'test2', 'result': 1},
 {'api': 'test3', 'result': 0}]
bn31dyow

bn31dyow2#

沉迷于代码高尔夫:

from itertools import groupby
dut = [
    {'api':'test1', 'result': 0},
    {'api':'test2', 'result': 1},
    {'api':'test3', 'result': 2},
    {'api':'test3', 'result': 0},
    {'api':'test3', 'result': 1},
]

res = [
    next(g)
    for _,g in groupby(
        sorted(dut, key=lambda d: tuple(d.values())),
        key=lambda i: i['api']
    )
]

结果:

Out[45]:
[{'api': 'test1', 'result': 0},
 {'api': 'test2', 'result': 1},
 {'api': 'test3', 'result': 0}]

使用itertools.groupby实用程序,将iterable fed作为第一个参数,并使用 sortedapi 以及 result 并按 result 只是。 groupby 返回键的iterable和组中项的iterable,如下所示:

In [56]: list(groupby(sorted(dut, key=lambda i: tuple(i.values())), key=lambda i: i['api']))
Out[56]:
[('test1', <itertools._grouper at 0x10af4c550>),
 ('test2', <itertools._grouper at 0x10af4c400>),
 ('test3', <itertools._grouper at 0x10af4cc88>)]

使用列表理解,由于组已经排序, next 用于获取组中的第一个项,并且丢弃组键。

ki0zmccv

ki0zmccv3#

假设输入 data 你可以做经典的sql groupby :

from itertools import groupby

# in case your data is sorted already by api skip the below line

data = sorted(data, key=lambda x: x['api'])

res = [
    {'api': g, 'result': min(map(lambda x: x['result'], v))} 
    for g, v in groupby(data, lambda x: x['api'])
]

输出:

[{'api': 'test1', 'result': 0}, {'api': 'test2', 'result': 1}, {'api': 'test3', 'result': 0}]
lh80um4z

lh80um4z4#

data = [
    {'api': 'test1', 'result': 0},
    {'api': 'test3', 'result': 2},
    {'api': 'test2', 'result': 1},
    {'api': 'test3', 'result': 1},
    {'api': 'test3', 'result': 0}
]

def find(data):
    step1 = sorted(data, key=lambda k: k['result'])
    print('step1', step1)

    step2 = {}
    for each in step1:
        if each['api'] not in step2:
            step2[each['api']] = each
    print('step2', step2)

    step3 = list(step2.values())
    print('step3', step3)
    print('\n')
    return step3

find(data)

试试这个,它会给你

step1 [{'api': 'test1', 'result': 0}, {'api': 'test3', 'result': 0}, {'api': 'test2', 'result': 1}, {'api': 'test3', 'result': 1}, {'api': 'test3', 'result': 2}]
step2 {'test1': {'api': 'test1', 'result': 0}, 'test3': {'api': 'test3', 'result': 0}, 'test2': {'api': 'test2', 'result': 1}}
step3 [{'api': 'test1', 'result': 0}, {'api': 'test3', 'result': 0}, {'api': 'test2', 'result': 1}]

首先对所有的api进行排序,然后为每个api找到第一个api,结果就出来了。

相关问题