Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找仅在一个集合中的元素的更快方法?_Python - Fatal编程技术网

Python 查找仅在一个集合中的元素的更快方法?

Python 查找仅在一个集合中的元素的更快方法?,python,Python,我希望遍历集合的列表,并查找具有唯一编号的集合/不会出现在列表中的任何其他集合中 注意此集合列表代表数独板中的一行,每组代表选项。如果只有一个元素,则表示板上该位置的数字 在下面的代码中,我定义了一个函数,可以检查一个集合是否有一个数字没有出现在列表中的另一个集合中但是,这是浪费,因为我将检查列表中包含多个元素的每个集合 如何更改此项/我可以使用什么使我能够以较便宜的方式多次执行此操作 def find_unique(数独选项,检查索引): 比较_set=set() 对于范围内的i(len(数独

我希望遍历集合的列表,并查找具有唯一编号的集合/不会出现在列表中的任何其他集合中

注意此集合列表代表数独板中的一行,每组代表选项。如果只有一个元素,则表示板上该位置的数字

在下面的代码中,我定义了一个函数,可以检查一个集合是否有一个数字没有出现在列表中的另一个集合中但是,这是浪费,因为我将检查列表中包含多个元素的每个集合

如何更改此项/我可以使用什么使我能够以较便宜的方式多次执行此操作

def find_unique(数独选项,检查索引):
比较_set=set()
对于范围内的i(len(数独选项)):
如果我检查索引:
比较集更新(列表(数独选项[i]))
对于数独中的S选项:
对于S中的项目:
如果不是比较集合中的项目:
退货项目
返回-1
以下是简单的测试代码:

如果名称=“\uuuuu main\uuuuuuuu”:
row1=[{1}、{3}、{5}、{6}、{8}、{9}、{4,7}、{4,7}、{2,4,7}]
x=查找唯一(第1行,第8行)
打印(x)
#输出:2(根据需要)

谢谢你的帮助

您可以使用以下方法简化:

#注意,这将返回一组所有唯一元素。
#得到所有的号码会让你不打电话
#函数多次执行,直到得到-1
#而不是遍历返回的集合。
def find_unique(选中,*其他):
#'check'是从中查找唯一元素的集合
#`other`是要比较的集合的元组
check=check.copy()#获取副本
对于其他中的set_uu:
#这将删除两个中都存在的元素
#`check`和`set\`并将其从
#“检查”。
检查-=设置_
#提前退出条件(其中“check”为空)
如果没有,请检查:
打破
退票

假设您最初的想法是从目标位置的集合中返回第一个唯一项(如初始函数所示):


我建议使用
defaultdict
,并为每个值保留它所属的集合列表。然后查找属于一个集合的元素

from collections import defaultdict
import typing

def find_sets_with_unique_elements(set_list: typing.List[typing.Set]):
    counter = defaultdict(list)
    for i, el in enumerate(set_list):
        for val in el:
            counter[val].append(i)
    return [(sets[0], val) for val, sets in counter.items() if len(sets) == 1]

if __name__ == "__main__":
    row1 = [{1}, {3}, {5}, {6}, {8}, {9}, {4,7}, {4,7}, {2,4,7}]
    x = find_sets_with_unique_elements(row1)
    print(x)

那么,可以通过以下方式实现2倍的增强:

[19]中的
row1[8]。差异(reduce(lambda x,y:x.union(y),row1[:8],set())
Out[19]:{2}
在[20]:%timeit第1行[8]。差异(减少(lambda x,y:x.union(y),第1行[:8],set())
每个回路4.7µs±105 ns(7次运行的平均值±标准偏差,每个100000个回路)
在[21]:%timeit find_unique(第1行,第8行)
每个回路8.32µs±71 ns(7次运行的平均值±标准偏差,每个100000个回路)
编辑:删除不必要的缩减:D,用于~6倍增强

[9]中的
:%timeit第1行[8]。差异(set.union(*第1行[:8]))
每个回路1.42µs±109 ns(7次运行的平均±标准偏差,每个1000000个回路)

不确定这是否是您想要的:

def find_unique(sudoku_options, check_index):
    sets_to_check = sudoku_options[:]
    check_set = sets_to_check.pop(check_index)

    all_numbers = set().union(*sets_to_check)
    return check_set - all_numbers

if __name__ == "__main__":
    row1 = [{1}, {3}, {5}, {6}, {8}, {9}, {4,7}, {4,7}, {2,4,7}]
    x = find_unique(row1, 8)
    for number in x:
        print(number)

创建所有集合的并集,并检查您的号码是否不在其中?@tripleee这将浪费一些内存。假设我们有
{2}
要从中检查,我们提供
({2},{3,4,5},{6,7,8})作为要从中检查的对象。如果我们在集合中循环,我们可以立即判断结果将是空的。(顺便说一句,创建大量集合的并集也很耗时。请查看中的数字6)如果这是一个数独板,整个集合将是9个数字。@Blonded我批准您的部分编辑。不应重用以下划线开头的变量。这是python约定
def find_unique(sudoku_options, check_index):
    sets_to_check = sudoku_options[:]
    check_set = sets_to_check.pop(check_index)

    all_numbers = set().union(*sets_to_check)
    return check_set - all_numbers

if __name__ == "__main__":
    row1 = [{1}, {3}, {5}, {6}, {8}, {9}, {4,7}, {4,7}, {2,4,7}]
    x = find_unique(row1, 8)
    for number in x:
        print(number)