我有这个列表:
list = [{1,2,3,4}, {3,4,5}, {2,6}]
我想将其作为输出:
{1,6}
因此,我只希望唯一数字具有输出。 这是我尝试过的方法,但是不起作用:
list = [{1,2,3,4}, {3,4,5}, {2,6}]
s1 = []
for number in list:
if number not in s1:
s1.append(number)
def unique(s1):
return set.difference(*s1)
print (unique(s1))
我的输出是:
{1, 2, 3, 4}
我不知道如何解决此问题?我是python初学者,因此任何人都可以解释答案是什么,为什么应该这样解决?提前非常感谢!
答案 0 :(得分:3)
使用Counter
对象。
>>> from collections import Counter
>>> from itertools import chain
>>> my_list = [{1,2,3,4}, {3,4,5}, {2,6}]
>>> set(k for k,v in Counter(chain.from_iterable(my_list)).items() if v == 1)
set([1, 5, 6])
chain.from_iterable
“变平” my_list
。 Counter
编译平展列表中的每个元素可以看到多少次,并且生成器表达式仅将映射为1的键发送给set
。
涉及的一些中间值:
>>> list(chain.from_iterable(my_list))
[1, 2, 3, 4, 3, 4, 5, 2, 6]
>>> Counter(chain.from_iterable(my_list))
Counter({2: 2, 3: 2, 4: 2, 1: 1, 5: 1, 6: 1})
答案 1 :(得分:3)
我先前发布的答案不正确。我不想放弃,我想找到一个仅使用集合的问题的答案。我并不是说这是比其他方法更好的答案,但它确实达到了我自己的目标,即不将任何额外的程序包引入解决方案:
def unique(data):
result = set()
dups = set()
for s1 in data:
# accumulate everything we see more than once
dups = dups | (result & s1)
# accumulate everything
result = (result | s1)
# the result is everything we only saw once, or in other words,
# everything we saw minus everything we saw more than once
return result - dups
print(unique([{1,2,3,4}, {3,4,5}, {2,6}]))
print(unique([{1}, {1}, {1}]))
输出:
set([1, 5, 6])
set([])
即使只使用集合,也可能有更好的解决方案。我一直想尝试使用最简单的工具集,因为我认为这样做是最容易理解的,而且常常会和其他任何东西一样有效。
答案 2 :(得分:0)
这不是花哨的python解决方案,但您可能想要构建一个dict,其中键是列表中的数字,而值是键出现的次数。
由于我们要执行许多次迭代,因此该解决方案绝不是最佳选择:
list = [{1,2,3,4}, {3,4,5}, {2,6}]
count_hash = {}
for dict in list:
for number in dict:
if number in count_hash:
count_hash[number] += 1
else:
count_hash[number] = 1
for number in count_hash:
if count_hash[number] == 1:
print(number)
答案 3 :(得分:0)
我同意chepner使用计数器。使用functools。reduce扁平化列表来自here。
import functools
import operator
from collections import Counter
my_list = [{1,2,3,4}, {3,4,5}, {2,6}]
flat_list = functools.reduce(operator.iconcat, my_list, [])
results = [k for (k, v) in Counter(flat_list).items() if v == 1]
print(results)
# OUTPUT
# [1, 5, 6]
答案 4 :(得分:0)
我没有看到像我的解决方案那样给出的任何答案。我希望给定集合的对称差异能够为这个问题提供正确的方式。
>>> L = [{1,2,3,4}, {3,4,5}, {2,6}]
>>> M = L[0]
>>> for s in L[1:]:
M ^= s
>>> M
{1, 5, 6}
注意:问题是关于列表的,但是他给出的列表是一组列表。