如何在新列表中获取列表的唯一编号?

时间:2019-03-10 17:01:03

标签: python

我有这个列表:

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初学者,因此任何人都可以解释答案是什么,为什么应该这样解决?提前非常感谢!

5 个答案:

答案 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_listCounter编译平展列表中的每个元素可以看到多少次,并且生成器表达式仅将映射为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}

注意:问题是关于列表的,但是他给出的列表是一组列表。