【问题标题】:list comprehension to filter a list of lists列表理解以过滤列表列表
【发布时间】:2022-11-29 18:14:21
【问题描述】:

这个问题来自https://leetcode.com/problems/find-players-with-zero-or-one-losses/。是否可以在此问题中使用列表理解来创建一个新列表,该列表仅包含每个元组的第一项,而永远不会出现在任何元组的第二项中。

例如:

matches = [[1,3],[2,3],[3,6],[5,6],[5,7],[4,5],[4,8],[4,9],[10,4],[10,9]]

我想要一个新列表:

neverLost = [1, 2, 10]

我会制作两个列表,一个用于问题的每个部分和列表理解,然后将它们连接在一起以获得解决方案。我尝试使用列表理解,但遇到语法问题

neverLost = [w for w, l in matches if w not l]

第一部分w for w, l in matches工作正常,将创建一个列表,仅包含每个元组[1, 2, 3, 5, 5, 4, 4, 4, 10, 10] 的第一项,但我在语法和对表达式的理解上苦苦挣扎,以过滤“获胜者”。请让我知道这是否是解决问题的好方法。我知道我可能可以用字典来做到这一点,但我想知道这种方式是否也可行。谢谢!

【问题讨论】:

    标签: python list list-comprehension


    【解决方案1】:

    列表理解有效,但不是解决此类问题的优化方法

    In [48]: list(set([j[0] for j in matches if j[0] not in [i[1] for i in matches]]))
    Out[48]: [1, 2, 10]
    

    【讨论】:

      【解决方案2】:

      你做了什么

      neverLost = [w for w, l in matches if w not l]
      

      将检查该元组中的第一项是否等于同一元组中的第二项。这是不是检查第一项是否出现在任何其他元组的第二个位置。

      你可以用这个 -

      list(set([w[0] for w in matches if w[0] not in [l[1] for l in matches]]))
      

      【讨论】:

        【解决方案3】:

        我认为你需要做类似的事情,

        matches = [[1, 3], [2, 3], [3, 6], [5, 6], [5, 7], [4, 5], [4, 8], [4, 9], [10, 4], [10, 9]]
        
        losses_dict = {}
        for (_, value) in matches:
            losses_dict.setdefault(value, 0)  # key might exist already
            losses_dict[value] += 1
        
        final_list = [
                      [k for k, _ in matches if k not in losses_dict.keys()],
                      [k for k, v in losses_dict.items() if v == 1]
                     ]
        
        

        dict.setdefault 检查键是否已经存在,否则它附加值 0。

        【讨论】:

          【解决方案4】:

          当然,这样的事情是一个合理的解决方案:

          seconds = {second for _, second in matches}
          never_lost = [first for first, _ in matches if first not in seconds]
          never_lost = list(dict.fromkeys(never_lost))  # idiom for removing duplicates while maintaining order
          

          现在,如果你的意思是仅使用单个列表理解表达式,那么你必须变得非常笨拙:

          never_lost = [
              x for x in
              {
                  first: None
                  for first, _ in matches 
                  for seconds in [{second for _, second in matches}] 
                  if first not in seconds
              }
          ]
          

          我会坚持第一种方法。并非所有内容都必须或应该是单个列表理解表达式。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-06-24
            • 2013-09-29
            • 2011-03-02
            • 2013-12-02
            • 1970-01-01
            相关资源
            最近更新 更多