通过过滤优化嵌套的for循环

通过过滤优化嵌套的for循环

我正在尝试通过过滤优化嵌套的for循环,代码如下:

user_ids = ['A', 'B', 'C']

all_dict_1 = [
    {
       'id': 'all',
       'user_id': 'B',
    },
    {
       'id': 'foo',
       'user_id': 'B',
    },
    {
       'id': 'bar',
       'user_id': 'A',
    },
    {
       'id': 'bar',
       'user_id': 'D',
    },
]

all_dict_2 = [
    {
        'id': 'all',
        'percentage': 0.2,
    },
    {
        'id': 'foo',
        'percentage': 0.3,
    },
]


def _filter(dict_1, dict_2, user_ids):
    if str(dict_1['user_id']) in user_ids:

        if dict_2['id'] == 'all':
            dict_1['percentage'] = dict_2['percentage']
            return dict_1

        if dict_1['id'] == dict_2['id']:
            dict_1['percentage'] = dict_2['percentage']
            return dict_1

    return None


hits = [_filter(x, y, user_ids) for x in all_dict_1 for y in all_dict_2]

hits = [i for i in hits if i] # Removing None values


all_dict_1列表特别长(成千上万个对象),因此该函数需要1秒钟以上的时间才能运行😕

有图书馆或技术可以使其更快吗?

最佳答案

您的问题中的逻辑可以简化为以下列表理解,这应该稍快一些:

>>> hits = [{**x, 'percentage': y['percentage']}
                for x in all_dict_1 for y in all_dict_2
                    if x['user_id'] in user_ids and
                       (y['id'] == 'all' or x['id'] == y['id'])]
>>> hits
[{'id': 'all', 'user_id': 'B', 'percentage': 0.2},
 {'id': 'foo', 'user_id': 'B', 'percentage': 0.2},
 {'id': 'foo', 'user_id': 'B', 'percentage': 0.3},
 {'id': 'bar', 'user_id': 'A', 'percentage': 0.2}]

关于python - 如何在python中通过过滤优化嵌套的for循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60061744/

10-16 18:22