1

我将列表的元素my_list与:

my_combinison = itertools.product(*my_list)

所以它为我创建了一个2614234组合元素列表,我想验证组合列表中的每个元素是否都是对象中的范围

list_contries_ok = list({'cities_scope': x, 'status': 1} for x in my_combinison if City.objects.only('country_id', 'city_scope').filter(country_id=CN, city_scope=','.join(x)).prefetch_related('country_id')) 
list_contries_ko = list({'cities_scope': x, 'status': 0} for x in my_combinison if not City.objects.only('country_id', 'city_scope').filter(country_id=CN, city_scope=','.join(x)).prefetch_related('country_id'))
list_contries = list_contries_ok.append(list_contries_ko)

我是我的最后一个列表,我想要列出迭代每个组合并说出它的状态的列表1 or 0

我花了几分钟的时间来执行:S 有没有其他明确的方法来减少这么长的列表的时间?

4

2 回答 2

1

my_combinison当您只需要进行一次时,您正在进行两次传递:

def predicate(x):
    t1 = City.objects.only('country_id', 'city_scope')
    t2 = t1.filter(country_id=CN,city_scope=','.join(x))
    return 1 if t2.prefetch_related('country_id') else 0

list_countries = [ { 'cities_scope': x, 'status': predicate(x) }
                    for x in my_combinison ]

随心所欲地定义predicate;关键是前两个列表之间的唯一区别是长表达式是真(将状态设置为 1)还是假(将状态设置为 0)。您可以list_countries一次性创建,然后在必要时将其拆分为两个单独的列表(这应该更快,因为您不再首先为每个项目运行复杂的查询。)

list_countries_ok = [ x for x in list_countries if x['status'] ]
list_countries_ko = [ x for x in list_countries if not x['status'] ]
于 2013-11-01T17:21:02.013 回答
0
list_countries_ok = [ x and list_countries.remove(x) for x in list_countries if x['status'] ]

现在在 list_countries 中,您将拥有 list_countries_ko 而无需对其进行迭代。

于 2013-11-01T18:46:21.397 回答