【问题标题】:Python list comprehension, with unique itemsPython 列表理解,具有独特的项目
【发布时间】:2012-09-22 19:15:48
【问题描述】:

有没有办法在 Python 中生成仅包含唯一项的列表推导式?

我最初的想法是使用这样的东西: new_items = [unicode(item) for item in items]

但是,我后来意识到我需要省略重复的项目。所以我最终得到了这个丑陋的怪物:

unique_items = []
for item in items :
    unicode_item = unicode(item)
    if unicode_item not in unique_items :
        unique_items.append(unicode_item)

现在这远没有简单的列表理解那么漂亮(和可读性)。那么,有没有办法让列表推导等效于上面的代码?

顺序也很重要,所以我不能只使用集合推导。

【问题讨论】:

  • 有趣,我最初的想法是您可以在列表推导中进行过滤,但后来我意识到您需要访问您在过滤条件中创建的新列表。
  • 如果订单很重要,我如何知道要使用哪个重复项目实例?第一个,最后一个,还是中间的一个?
  • @mgilson 经过快速检查,似乎这个问题的接受答案比链接问题的接受答案更有效。

标签: python list list-comprehension


【解决方案1】:

您最初的想法适用于集合理解:

new_items = {unicode(item) for item in items}

【讨论】:

    【解决方案2】:

    好吧,没有有序集合,但我们可以误用 OrderedDict:

    from collections import OrderedDict
    t = "never gonna give you up"
    OrderedDict.fromkeys(t).keys()
    

    给予:

    ['n', 'e', 'v', 'r', ' ', 'g', 'o', 'a', 'i', 'y', 'u', 'p']
    

    【讨论】:

    • 哦,非常好。附带说明一下,尝试使用来自itertools 的repeat(None) 而不是[None]*len(t)
    • OrderedDict.fromkeys(t).keys() 怎么样? [请注意,这种方法以及 set 方法将我们限制为可散列的元素。]
    • 是的,更好。感谢您的建议!
    【解决方案3】:

    我做空一个班轮可能是:

    s = "some string"
    unique_items = [unicode(ch) for ch in sorted(set(s), key=s.index)]
    

    【讨论】:

    • 有效,但对于较大的列表不是很有效。
    • 不,但它的意图很简短,很容易理解。
    【解决方案4】:

    让它成为一个辅助函数,就像这样。

    def unique_iter(iterable):
      seen = set()
      for item in iterable:
        if item in seen:
          continue
        seen.add(item)
        yield item
    
    for ch in unique_iter("never gonna give you up"):
      print ch,
    

    输出

    n e v r g o a i y u p

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-04
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 2013-02-21
      • 2019-06-20
      • 2018-04-13
      相关资源
      最近更新 更多