如何检查列表的“未排序版本”是否已存在?

安东尼奥

我想生成一个列表列表。每个子列表都是通过从采样生成的range(100)我需要确保主列表中不存在相同的列表(即具有完全相同的元素)但排序不同的列表(即我不希望[1,2,3]同时[2,1,3]在主列表中)。这是我写的:

import random as rd
my_list = []
while len(my_list) < 50:
    p = rd.sample(range(100), 10)
    if p not in my_list: my_list.append(p)

问题是if p not in my_list它没有考虑[1,2,3]并没有起到作用[2,1,3]我想到做这样的事情:

my_list = []
while len(my_list) < 50:
    p = rd.sample(range(100), 10)
    for i in range(len(my_list)):
        if set(p) != set(my_list[i]): my_list.append(p)

但这似乎卡在了第一个循环中,程序永无休止。我想知道在Python中是否有一种简单的方法?

克里斯蒂法蒂

您将在(如果有条件的话)for循环内附加生成的列表
但是,鉴于my_list开头是空的事实

  • 环是一种无操作
  • 如果永远不会执行
  • 因此,没有元素附加到my_list,因此它永远不会被修改
  • 您会遇到无限循环(或者处于僵局)

要解决此问题,请将您的循环([Python 3.Docs]:复合语句-for语句重构为:

for existing in my_list:
    if set(p) == set(existing):
        break
else:
    my_list.append(p)

它运行不到0.1秒。

为了进一步改善性能,请将集合存储在单独的列表中(避免不必要地不必要地重新计算它们)并将其用于包含测试:

code.py

#!/usr/bin/env python3

import sys
import random
import time


def main():
    final_list = list()
    sentinel_list = list()
    start_time = time.time()
    count = 0
    while len(sentinel_list) < 50:
        inner_list = random.sample(range(100), 10)
        inner_set = set(inner_list)
        if inner_set not in sentinel_list:
            final_list.append(inner_list)
            sentinel_list.append(inner_set)
        count += 1
    del sentinel_list
    print("{:d} element list generated in {:d} iterations".format(len(final_list), count))
    print("Took {:.3f} seconds".format(time.time() - start_time))


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main()
    print("\nDone.")

输出

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q056317300]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" code.py
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32

50 element list generated in 50 iterations
Took 0.003 seconds

Done.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章