我列出的两个列表: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]]
等于列表的两个列表合并在一起,然后摆脱或重复的值。
我列出的两个列表: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]]
等于列表的两个列表合并在一起,然后摆脱或重复的值。
以前的答案似乎并不满足您的要求,列出可以是不同的尺寸。
我的解决方案使用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]]
一般 - 假设导致子列表元素的顺序并不重要,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)
对于它似乎什么就像你正在寻找的那样,我会保留一组以前的值。
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)
,你可以切换我的条件匹配@PatrickHaugh答案。他有点干净。 – bravosierra99
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)
公顷,几乎同一时间几乎相同的解决方案 – bravosierra99
考虑使用'set.symmetric_difference' –
@ PM2Ring我想在顺序无关的情况下避免对'a'和'b'使用'set's。 –
你正试图避免在任何的任意值以前的列表在合并期间? – bravosierra99
是列表总是相同的大小? – Michael
摆脱重复值通常意味着你仍然保留其中的一个值,你真的意味着第三个例子不应该有58和86? –