【问题标题】:how to print elements which occur only once in a list, without counting如何打印列表中仅出现一次的元素,而不计算
【发布时间】:2013-06-21 03:22:14
【问题描述】:

如果我有一个字典 {key : [a b c c d]} 并且我只想打印与每个键对应的唯一值(在本例中为 (a,b,d)),那么最有效的方法是什么?除了循环遍历每个元素并对其进行计数之外?

【问题讨论】:

  • 在这种情况下你不是说(a,b,c,d)吗?
  • 不,我的意思是只打印 (a,b,d)。我不想打印 c。
  • 我认为 OP 的问题非常明确和明确。没有计数,只有唯一的元素(只出现一次)。不是列表中的每个元素,不包括重复项。
  • 有这样(奇怪的)要求,说明你为什么有这些要求总是有用的。使用Counter 有什么问题?

标签: python


【解决方案1】:

如果元素按照您的示例进行排序;你可以使用itertools.groupby():

from itertools import groupby

print " ".join([k for k, group in groupby(d['key']) if len(list(group)) == 1])
# -> a b d

【讨论】:

  • @vkaul11,如果你这样做,你可以通过删除 " ".join( ... ) 部分来获取列表。
  • 感谢 Sebastian 的提示。
【解决方案2】:

一个选项,使用collections.Counter

from collections import Counter
d = {'k': ['a', 'b', 'c', 'c', 'd']}
c = Counter(d['k'])
print [k for k in c if c[k] == 1]
['a', 'b', 'd']

【讨论】:

  • 如果您阅读Counter 的源代码,它只是“循环遍历每个元素并对其进行计数”,这是 OP 不想要的。
  • @1_CR 至少感谢您理解我的问题。我遭到了甚至不理解我的问题的人的反对。
  • @vkaul11 我赞成补偿。我认为您的问题虽然很难找到用例,但非常合理且措辞清晰。 SO 上的 Python 开发人员喜欢使用计数器和集合。 :P
【解决方案3】:

您可以从collections 使用Counter

>>> d = {'key': ['a', 'b', 'c', 'c', 'd']}
>>> 
>>> from collections import Counter
>>> 
>>> new_dict = Counter(d['key'])
>>> new_dict
Counter({'c': 2, 'a': 1, 'b': 1, 'd': 1})
>>> [elem for elem in new_dict.keys() if new_dict[elem] == 1]
['a', 'b', 'd']

【讨论】:

  • OP 想要找到只包含一次的元素。
  • @2rs2ts。是的,糊涂了。更新了答案。
  • 我很感激,我讨厌迂腐,但OP也要求不计较。
【解决方案4】:

不使用计数器:

unique = []
for i, val in enumerate(d['key']):
    if item not in d['key'][i+1:] and item not in d['key'][:i]:
        unique.append(item)

使用生成器推导:

unique = list((d['key'][i] for i in range(len(d['key'])) if d['key'][i] not in d['key'][i+1:] and d['key'][i] not in d['key'][:i]))

【讨论】:

  • 我必须说非常创新的解决方案。
  • 这个算法是O(n²),比使用Counter效率还要低,是O(n)。
  • 之前排序怎么样,只能检查下一个和上一个值?
  • @Maxime 好吧,排序会为您要做的任何其他事情增加 O(n log n) 时间复杂度。
  • @2rs2ts item not in d['key'][i+1:] 对列表进行 O(n) 搜索。
【解决方案5】:

假设列表已排序:

>>> L = [1, 1, 2, 3, 4, 4, 4, 5]
>>> [e for i, e in enumerate(L) if e == L[i-1] and i < len(L)-1 and not e == L[i+1]]
[1, 4]

【讨论】:

    【解决方案6】:

    您可以使用set() 来查找每个列表中的所有唯一元素。

    for key in mydict:
        uniques = set(mydict[key])
    

    【讨论】:

    • 再一次,我只想打印唯一的元素,根本不打印重复的元素。在这里您将打印所有元素,尽管您只会打印一次重复项。
    • 你想要的是只打印出现一次的元素。这与打印唯一元素列表不同。
    【解决方案7】:

    在 Python 中,您可以利用集合(集合不能有重复元素)来查找每个键中的唯一元素,然后将集合转回列表

    for key in dict:
        print list(set(dict[key]))
    

    【讨论】:

    • 如果列表中有 (a,b,c,c,d) 我只想打印 (a,b,d) ) 而不是打印 c。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    相关资源
    最近更新 更多