Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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:对于set1中的每个项目,使用set1中的其他项目作为值创建一个dict_Python_Performance_Set - Fatal编程技术网

Python:对于set1中的每个项目,使用set1中的其他项目作为值创建一个dict

Python:对于set1中的每个项目,使用set1中的其他项目作为值创建一个dict,python,performance,set,Python,Performance,Set,很抱歉,这个奇怪的标题不知道如何更好地解释(请随意编辑)。 我不知道如何(有效地)做到以下几点。假设我有一个集合{a,b,c},我想得到以下输出: {a: {b,c}} {b: {a,c}} {c: {a,b}} 我找到了这样做的方法,但我认为它不是高效的/pythonic的(因为我怀疑Python中有这样做的函数): 这将打印:[{'b':{'c','a'},{'c':{'b','a'},{'a':{'b','c'}]是的,有一种更简洁的方法:使用操作符 set1 = {'a','b','c

很抱歉,这个奇怪的标题不知道如何更好地解释(请随意编辑)。

我不知道如何(有效地)做到以下几点。假设我有一个集合
{a,b,c}
,我想得到以下输出:

{a: {b,c}}
{b: {a,c}}
{c: {a,b}}
我找到了这样做的方法,但我认为它不是高效的/pythonic的(因为我怀疑Python中有这样做的函数):


这将打印:
[{'b':{'c','a'},{'c':{'b','a'},{'a':{'b','c'}]

是的,有一种更简洁的方法:使用操作符

set1 = {'a','b','c'}
output = [{u: set1-{u}} for u in set1]
print(output)
输出

[{'c': {'a', 'b'}}, {'a': {'c', 'b'}}, {'b': {'c', 'a'}}]

另一个相关的方法是从
u
生成一个1项元组,而不是一个集合。好处是元组比集合更简单,构建速度更快;当然,Python集相当有效,尽管它们确实有哈希表的开销

set1 = {'a','b','c'}
output = [{u: set1.difference((u,))} for u in set1]
print(output)
此代码提供与前一代码等效的输出


尽管我们调用了set difference方法,但该方法实际上并没有从iterable arg构建一个集合,它只是直接对其进行迭代。

是的,有一种更简洁的方法:使用操作符

set1 = {'a','b','c'}
output = [{u: set1-{u}} for u in set1]
print(output)
输出

[{'c': {'a', 'b'}}, {'a': {'c', 'b'}}, {'b': {'c', 'a'}}]

另一个相关的方法是从
u
生成一个1项元组,而不是一个集合。好处是元组比集合更简单,构建速度更快;当然,Python集相当有效,尽管它们确实有哈希表的开销

set1 = {'a','b','c'}
output = [{u: set1.difference((u,))} for u in set1]
print(output)
此代码提供与前一代码等效的输出


尽管我们调用了集合差分方法,但该方法实际上并没有从其iterable参数构建集合,它只是直接对其进行迭代。

PM 2Ring的集合差分方法很好,而且是最紧凑的。出于完整性考虑,并且由于它更普遍适用,例如,如果您希望dict值是列表、元组或生成器,则应建议使用以下基于条件理解的版本:

output = [{u: {x for x in set1 if x != u}} for u in set1]
# output = [{u: [x for x in set1 if x != u]} for u in set1]
# output = [{u: (x for x in set1 if x != u)} for u in set1]

pm2ring的集差法是精细且最紧凑的。出于完整性考虑,并且由于它更普遍适用,例如,如果您希望dict值是列表、元组或生成器,则应建议使用以下基于条件理解的版本:

output = [{u: {x for x in set1 if x != u}} for u in set1]
# output = [{u: [x for x in set1 if x != u]} for u in set1]
# output = [{u: (x for x in set1 if x != u)} for u in set1]


我在这里找不到特别低效的东西。可能将循环中的前两行替换为
temp_set={x for x in set1 if x!=item}
,以避免必须删除元素,但是如果不进行分析,我真的无法判断它是否更快。我在这里找不到任何特别低效的东西。可能将循环中的前两行替换为
temp_set={x for x in set1 if x!=item}
,以避免删除元素,但如果不进行分析,我真的无法判断它是否更快;实例化一个新的集合只是为了减去它,可能不是超高效的。尽管set构造相当便宜,但还是有更好的配置。如果我们使用集合差分的方法形式,我们可以用元组来代替。但这并不太节省。@阿马丹,我不明白为什么<代码> SET1-{U}需要建立一个额外的集合来从中减去。@ sWoWaseGGL,我们正在构造一个新的集合,用“代码> {U} < /代码>。@ PM2ONE哦,右边的单子:)开销太小了,我甚至没有考虑它。实例化一个新的集合只是为了减去它,可能不是超高效的。尽管set构造相当便宜,但还是有更好的配置。如果我们使用集合差分的方法形式,我们可以用元组来代替。但是这并不是一个很大的节约。@Amadan我不明白为什么
set1-{u}
需要建立一个额外的集来进行减法。@schwobaseggle我们正在用
{u}
@PM2Ring构建一个新的集哦,右边的单元格:)开销很小,我甚至没有考虑过。我猜想内部集合理解中的Python循环将比由SET差异操作执行的内部循环慢得多。此外,我们不能将列表之类的不易损坏的东西存储在集合中,因此没有必要过于笼统。@PM2Ring我同意性能部分。但是dict值不必是可散列的。我又添加了两个示例来说明我的观点。Dict值当然不需要散列,但Dict键和set项需要散列。我怀疑内部集合理解中的Python循环将比set difference操作执行的内部循环慢得多。此外,我们不能将列表之类的不易损坏的东西存储在集合中,因此没有必要过于笼统。@PM2Ring我同意性能部分。但是dict值不必是可散列的。我又添加了两个例子来说明我的观点。Dict值当然不需要是可散列的,但Dict键和set项可以。