2016-10-20 179 views
2

我列出的两个列表:Python:如何合并列表的两个列表,避免重复?

ll1=[[17],[35,6],[47,58,86]]

ll2=[[19],[75,8],[17,58,86]]

我怎么能合并他们,也许在for循环,创建列表ll3的一个新的列表,并跳过重复值?

预期的结果将是: ll3=[[17,19],[35,6,75,8],[47,58,86]]

等于列表的两个列表合并在一起,然后摆脱或重复的值。

+1

你正试图避免在任何的任意值以前的列表在合并期间? – bravosierra99

+0

是列表总是相同的大小? – Michael

+0

摆脱重复值通常意味着你仍然保留其中的一个值,你真的意味着第三个例子不应该有58和86? –

回答

2

以前的答案似乎并不满足您的要求,列出可以是不同的尺寸。

我的解决方案使用set十字路口和联合。注:我正在使用Python2,将zip_longest更改为izip_longest

ll1=[[17],[35,6],[47,58,86]] 
ll2=[[19],[75,8],[17,58,86]] 

from itertools import zip_longest 

ll3 = [] 
seen = set() 
for a, b in zip_longest(ll1, ll2, fillvalue=[]): 
    new = (set(a) | set(b)) - seen 
    ll3.append(list(new)) 
    seen |= new 
print (ll3) 

这将打印:

[[17, 19], [8, 75, 35, 6], [58, 86, 47]] 

这也将工作,如果:

ll1=[[17],[35,6],[47,58,86],[5]] 
ll2=[[19],[75,8],[17,58,86]] 

返回:

[[17, 19], [8, 75, 35, 6], [58, 86, 47], [5]] 
+0

为什么我会得到'ImportError:无法导入名称zip_longest'?以前从未想过我。使用Python 2.7.11,32位 – FaCoffee

+2

@ CF84如果您使用的是Python2,请在导入和“for”循环中将名称更改为“izip_longest” – brianpck

+0

对不起,我犯了一个小错误。预期的结果必须包括我错误地遗漏的'58'和'86'。检查我的编辑,再次,道歉。 – FaCoffee

-1

一般 - 假设导致子列表元素的顺序并不重要,2所列出的长度是相同的,你可以使用拉链设置

ll3 = [set(l1 + l2) - set(l1).intersection(l2) for l1, l2 in zip(ll1, ll2)] 
seen = set() 
for idx, elem in enumerate(ll3): 
    ll3[idx] = list(elem - seen) 
    seen.update(elem) 
+4

这不提供正确的解决方案。 – bravosierra99

+1

这不会跳过重复值,而是在结果中包含一个副本 –

+0

您是正确的 - 已修复 – volcano

1

对于它似乎什么就像你正在寻找的那样,我会保留一组以前的值。

old_values = {} 
ll3 = [] 
for list_a, list_b in zip(ll1,ll2): 
    temp_list = [] 
    for item in list_a: 
    if item in old_values or item in list_b: 
     pass 
    else: 
     temp_list.append(item) 
     old_values.add(item) 
    for item in list_b: 
    if item in old_values or item in list_a: 
     pass 
    else: 
     temp_list.append(item) 
     old_values.add(item) 
    ll3.append(temp_list) 
+0

,你可以切换我的条件匹配@PatrickHaugh答案。他有点干净。 – bravosierra99

2
seen = set() 
res = [] 
for a, b in zip(l1, l2): 
    subres = [] 
    for item in a: 
     seen.add(item) 
     if item not in b and item not in seen: 
      subres.append(item) 
    for item in b: 
     seen.add(item) 
     if item not in a and item not in seen: 
      subres.append(item) 
    res.append(subres) 
+1

公顷,几乎同一时间几乎相同的解决方案 – bravosierra99

+1

考虑使用'set.symmetric_difference' –

+0

@ PM2Ring我想在顺序无关的情况下避免对'a'和'b'使用'set's。 –