【问题标题】:Efficient way to union two list with list or None value将两个列表与列表或无值联合的有效方法
【发布时间】:2018-03-04 04:21:36
【问题描述】:

我有两个列表,可以是 listNone。我想获得第三个列表,其结果是唯一的,将这两个列表联合起来。

  • 如果first 列表是None 并且secondNone - result 将是None
  • 如果 firstNone 并且 second 不是 None - result 将是 second
  • 如果 secondNone 并且 first 不是 None - result 将是 first
  • 如果 second 不是 Nonefirst 不是 None - result 将是 first + second

我用 if 条件来做这个简单的事情:

result = first if first else second
if result is not None:
    try:
        result = list(set(first + second))
    except TypeError:
        pass

            

我想以更好的方式做到这一点。也许您知道使用itertools 或其他方式通过一个或多个字符串来解决此问题的方法。

【问题讨论】:

  • 除此之外,最短的(尽管可能效率不高)是set((first or []) + (second or []))
  • 目标不就是寻找独特的元素吗?
  • @myaut,我想找到更有效的方法,如果它会更大,那么好吧,没关系!
  • @synchronizer,是的,目标是找到获取唯一列表的有效方法
  • [1, 2, 3][2, None, 6] 的预期结果是什么?

标签: python algorithm python-2.7 python-3.x list


【解决方案1】:

使用itertools.chain.from_iterable 的单线解决方案可以是:

set(itertools.chain.from_iterable((first or [], second or [])))

编辑:

我对不同的解决方案做了一些计时,这是我获得的(在我的计算机上,使用 python3.6),对于 10000 个项目的 2 个列表的 10000 次迭代:

  • OP 方式:7.34 秒
  • 原始设置方式(来自@myaut 的评论:set((first or []) + (second or []))):5.95 秒
  • itertools 方式:5.69 秒

所以 itertools 的方式要快一点,chain 方法比 + 操作符的 list 更好:)。

【讨论】:

    【解决方案2】:

    好吧,我会直截了当:如果列表是 None,则将其替换为空列表,然后将两者连接起来:

    def concat(l1, l2):
        if l1 is None and l2 is None:
            return None
        elif l1 is None:
            l1 = []
        elif l2 is None:
            l2 = []
    
        s = set(l1 + l2)
    
        return  s
    

    一些结果:

    >>> concat(None, None) is None
    True
    >>> concat([1,2,3], None)
    set([1, 2, 3])
    >>> concat(None, [4,5])
    set([4, 5])
    >>> concat([1,2,3], [4,5])
    set([1, 2, 3, 4, 5])
    >>> concat([1,2,3], [])
    set([1, 2, 3])
    >>> concat([], [])
    set([])
    

    有很多方法可以做到这一点,但对我来说,这很明显不需要聪明。

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2021-09-12
      • 2023-02-21
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      相关资源
      最近更新 更多