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

时间:2017-10-13 08:54:48

标签: python performance set

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

我无法弄清楚如何(有效地)执行以下操作。我们假设我有一组{a,b,c},我希望得到以下输出:

{a: {b,c}}
{b: {a,c}}
{c: {a,b}}

我找到了一种方法,但我认为它不是高效/ pythonic(因为我怀疑Python中有一个函数可以这样做):

set1 = {'a','b','c'}
output = []
for item in set1:
    temp_set = set1.copy()
    temp_set.remove(item)
    output.append({item: temp_set})
print(output)

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

2 个答案:

答案 0 :(得分:4)

是的,有一种更紧凑的方式:使用set difference运算符。

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项元组。好处是元组比集合更简单,构建速度更快; OTOH,Python集合相当有效,尽管它们确实有哈希表的开销。

set1 = {'a','b','c'}
output = [{u: set1.difference((u,))} for u in set1]
print(output)

此代码提供与前一代码等效的输出。

即使我们调用set difference方法,该方法实际上并没有从它的可迭代arg构建一个集合,但它只是直接迭代它。

答案 1 :(得分:0)

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]