gpt4 book ai didi

python - 如何检查集合中是否已存在列表的 "unsorted version"?

转载 作者:太空宇宙 更新时间:2023-11-04 11:19:26 25 4
gpt4 key购买 nike

我想生成一个列表列表。每个子列表将通过从 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 中是否有一种简单的方法可以做到这一点?

最佳答案

您将生成的列表 append 到(if 有条件的)for 循环中。
但是,考虑到 my_list 一开始是空的:

  • for 循环是无操作
  • 永远不会执行if
  • 因此没有元素 append 到my_list,所以它永远不会被修改
  • 你得到一个无限循环(或者你处于一种死锁的情况)

要修复它,请将您的循环 ( [Python 3.Docs]: Compound statements - The for statement) 重构为:

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

它运行不到 0.1 秒。

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

代码.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.

关于python - 如何检查集合中是否已存在列表的 "unsorted version"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56317300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com