【问题标题】:Sorting elements from a list of tuples into two separate lists将元组列表中的元素排序到两个单独的列表中
【发布时间】:2021-12-23 22:52:16
【问题描述】:

正如标题所说,我正在将标记的元素分类到两个列表中。 我目前的代码是:

lst = [("foo", "good"), ("bar", "bad")...("x", "n")]

def sort(items):
    good = []
    bad = []
    for i in range(len(items)):
        if items[i][1] == 'good':
            good += items[i][0]
        else:
            bad += items[i][0]
    return good, bad


alpha, beta = sort(lst)

我的输出只是f。我一直在努力解决这个问题,但解决方案一直在逃避我。 有什么建议吗?

谢谢大家。

【问题讨论】:

  • good.append(... 而不是 +=
  • 我几乎在发布此问题后就通过将good += items[i][0] 更改为good += [items[i][0]] 修复了它,但感谢您的回复。
  • 我强烈建议不要将你的函数命名为sort,因为使用该函数阅读你的代码的每个人都会假设它执行sort,在普遍意义上计算机科学中的那个词。即,它与内置函数 sortedlist.sort 做同样的事情。
  • 谢谢。我只是为了这个问题改了名字,实际程序中的名字不一样。

标签: python list sorting tuples


【解决方案1】:

您可以修复您的代码:

def sort(items):
    good = []
    bad = []
    for x, y in items:
        if y == 'good':
            good.append(x)
        else:
            bad.append(x)
    return good, bad

请注意,+= 对应于 list.extend,它按元素添加可迭代对象。对于表示逐个字符的字符串。

【讨论】:

    【解决方案2】:

    要使用映射或过滤创建新列表,使用列表推导通常更短且更易于阅读,而不是在循环中调用.append

    data = [("foo", "good"), ("bar", "bad"), ("head", "good"), ("tails", "bad"), ("x", "n")]
    
    good_lst = [x for x,quality in data if quality == 'good']
    bad_lst = [x for x,quality in data if quality != 'good']
    
    print(good_lst)
    # ['foo', 'head']
    print(bad_lst)
    # ['bar', 'tails', 'x']
    

    【讨论】:

      【解决方案3】:

      您可以尝试使用list comprenhension 计算两个列表以更简洁的方式解决此问题:

      def sort(items):
          good = [item[0] for item in items if item[1] == 'good']
          bad = [item[0] for item in items if item[1] == 'bad']
      
          return good, bad
      

      如果 性能 不是问题,这可能会更好,因为它是一种 声明性 方法而不是 命令性 方法,所以它可能是更易于阅读,但考虑到它会迭代列表两次。

      希望对你有帮助!

      【讨论】:

      • 这会不会因为它遍历列表两次而变慢?
      • @Severin12121 我认为这取决于列表的大小,因为list comprehension 通常比常规for-loops 更快。我已经更新了答案以说明这个问题以及为什么在某些情况下这可能会更好(只是为了便于阅读)。
      • 我认为直接迭代项目而不是索引会更具可读性和效率!
      • 是的,这是真的!我将编辑答案以更改它!
      【解决方案4】:

      你的代码很好,但你需要改变一件事:

      items[i][0] -> [items[i][0]]
      

      当您想使用+ 时,您需要将值作为列表:

      >>> [2,3] + [4]
      [2,3,4]
      

      您的代码有一处改动:

      lst = [("foo", "good"), ("bar", "bad"), ("head", "good"), ("tails", "bad")]
      
      def sort(items):
          good = []
          bad = []
          for item in items:
              if item[1] == 'good':
                  good += [item[0]]
              else:
                  bad += [item[0]]
          return good, bad
      
      
      alpha, beta = sort(lst)
      print (alpha, beta)
      

      输出:

      ['foo', 'head'] ['bar', 'tails']
      

      【讨论】:

        【解决方案5】:

        += 在您尝试将 LHS 添加到具有相同数据类型的 RHS 时使用。当您执行 good += items[i][0] 时,就像将 foo 作为列表 (['f', 'o', 'o']) 添加到列表 good。这就是你看到这种行为的原因。因此使用list.append() 将元素添加到列表中。 试试这个:

        lst = [("foo", "good"), ("bar", "bad"), ("head", "good"), ("tails", "bad")]
        
        def sort(items):
            good = []
            bad = []
            for item in items:
                #print (item, type(item))
                if item[1] == 'good':
                    good.append(item[0])
                else:
                    bad.append(item[0])
            return good, bad
        
        
        alpha, beta = sort(lst)
        print (alpha, beta)
        

        输出:

        ['foo', 'head'] ['bar', 'tails']
        

        【讨论】:

          【解决方案6】:

          我刚刚把good += items[i][0]改成了good.append(i[0])

          lst = [("foo", "good"),("bar", "bad"),("x", "n")]
          
          def sort(items):
              good = []
              bad = []
              for i in items:
                  if i[1] == 'good':
                      good.append(i[0])
                  else:
                      bad.append(i[0])
              return good, bad
          
          
          alpha, beta = sort(lst)
          print(alpha)
          print(beta)
          

          输出:

          ['foo']
          ['bar', 'x']
          

          【讨论】:

            猜你喜欢
            • 2019-02-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多