我想生成一个列表列表。每个子列表都是通过从采样生成的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开头是空的事实:
要解决此问题,请将您的循环([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] 删除。
我来说两句