【问题标题】:Filter array by unique item in list?按列表中的唯一项目过滤数组?
【发布时间】:2016-06-18 18:13:19
【问题描述】:

我想按子列表中的唯一项过滤列表

示例:

#       ---------
#       v       v
lst = [[1, 0], [1, 1], [2, 2]]

# result
[[1, 0], [2, 2]]

我正在使用,想要:

def setx0(arr):
   r = []
   filter(lambda x : r.append(x) if x[0] not in set(map(lambda x: x[0], r)) else False, arr)
   return r

更好的方法?

【问题讨论】:

  • 可以使用嵌套的 for 循环。会使它更具可读性(并且在没有调试器的情况下更容易调试)。

标签: python list dictionary filter unique


【解决方案1】:

我会直截了当:

lst = [[1, 0], [1, 1], [2, 2]]

seen = set()
new_list = []

for ele in lst:
    if ele[0] not in seen:
        new_list.append(ele)
        seen.add(ele[0])

print new_list

结果:

[[1, 0], [2, 2]]

【讨论】:

    【解决方案2】:

    假设列表已经排序,你可以使用itertools.groupby:

    >>> from itertools import groupby 
    >>> from operator import itemgetter
    >>> lst = [[1, 0], [1, 1], [2, 2]]
    >>> [next(g) for k, g in groupby(lst, itemgetter(0))] 
    [[1, 0], [2, 2]]
    

    【讨论】:

      【解决方案3】:

      效率不是很高,但如果你喜欢单行:

      try:
          reduce
      except NameError:  # Python 3
          from functools import reduce
      
      lst = [[1, 0], [1, 1], [2, 2]]
      
      filtered = reduce(lambda a, b: a+[b] if b[0] not in set(x[0] for x in a) else a,
                        lst, [])
      print(filtered)  # -> [[1, 0], [2, 2]]
      

      【讨论】:

        【解决方案4】:

        使用排序列表,最简单的是

        >>> lst = [[1, 0], [1, 1], [2, 2]]
        >>> dict(reversed(lst)).items()
        [(1, 0), (2, 2)]
        

        【讨论】:

          【解决方案5】:

          试试这个

          const lst = [[1, 0], [1, 1], [2, 2]],
                foundItems = [],
                result = []
          
          for (let i in lst) {
            const lstItem = lst[i]
            if (foundItems.indexOf(lstItem[0]) === -1) {
              foundItems.push(lstItem[0])
              result.push(lstItem)
            }
          }
          
          console.log(JSON.stringify(result)) // print [[1, 0], [2, 2]]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-01-30
            • 1970-01-01
            • 2020-01-13
            • 2020-08-23
            • 2013-01-29
            • 1970-01-01
            • 1970-01-01
            • 2022-12-07
            相关资源
            最近更新 更多