将两个列表与列表或无值结合的有效方法

时间:2017-09-22 14:34:58

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

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

  • 如果first列表second - result
  • 如果first second不是 - result将为second
  • 如果second first不是 - result将为first
  • 如果second不是first不是 - result将是first + second

如果条件:

,我就这么做了
result = first if first else second
if result is not None:
    try:
        result = list(set(first + second))
    except TypeError:
        pass

我想以更好的方式做到这一点。也许你知道用itertools或其他东西通过一个或多个字符串解决这个问题的方法。如果没有办法用另一种(更有效的)变体来解决这个问题,请不要贬低,只需说出来。

感谢您的所有建议!

2 个答案:

答案 0 :(得分:2)

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

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

编辑:

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

  • OP方式:7.34 s
  • raw set way(来自@myaut的评论:set((first or []) + (second or []))):5.95 s
  • itertools方式:5.69 s

因此,itertools方式更快一点,chain方法比列表的+运算符更好:)。

答案 1 :(得分:0)

嗯,我很简单:如果列表是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([])

有很多方法可以做到这一点,但对我而言,这是一个明确的案例,没有必要聪明。