很抱歉这个奇怪的标题并不知道如何更好地解释它(随时编辑它)。
我无法弄清楚如何(有效地)执行以下操作。我们假设我有一组{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'}}]
答案 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]