我对Python很新。我正在尝试编写一个函数,将单独列表中的唯一值合并到一个列表中。我一直得到一个列表元组的结果。最后,我想从我的三个列表-a,b,c中得到一个唯一值列表。任何人都可以帮我一把吗?
def merge(*lists):
newlist = lists[:]
for x in lists:
if x not in newlist:
newlist.extend(x)
return newlist
a = [1,2,3,4]
b = [3,4,5,6]
c = [5,6,7,8]
print(merge(a,b,c))
我正在获得一个列表元组
([1, 2, 3, 4], [3, 4, 5, 6], [5, 6, 7, 8])
答案 0 :(得分:16)
您可能只需要套装:
>>> a = [1,2,3,4]
>>> b = [3,4,5,6]
>>> c = [5,6,7,8]
>>>
>>> uniques = set( a + b + c )
>>> uniques
set([1, 2, 3, 4, 5, 6, 7, 8])
>>>
答案 1 :(得分:4)
如果您不关心它们是否按原始顺序排列,那么最简单且最不可能的方法是使用设置函数:
>>> set().union(a, b, c)
{1, 2, 3, 4, 5, 6, 7, 8}
如果你做关心原始顺序(在这种情况下集合恰好保留它,但不保证),那么你可以通过实现参数{{来修复你的原始尝试1}}包含你传入的所有原始列表的元组。这意味着迭代它会一次一个地获取每个列表,而不是它们中的元素 - 你可以通过使用itertools模块解决这个问题:
lists
此外,您希望for x in itertools.chain.from_iterable(lists):
if x not in newlist:
newlist.append(x)
作为空列表而不是输入列表的副本开始。
答案 2 :(得分:0)
def merge(*lists):
newlist = []
for i in lists:
newlist.extend(i)
return newlist
merge_list = merge(a,b,c,d)
merge_list = set(merge_list)
merge_list = list(merge_list)
print(merge_list)
答案 3 :(得分:0)
处理列表的动态生成
一个常见的用例是动态生成列表列表,每个子列表有时具有任意长度:
import random
abc, values = [], ["a", "b", "c", "d"]
for i in range(3):
l = []
for j in range(3):
l.append(values[random.randint(0, len(values) - 1)])
abc.append(l)
如果您要使用列表列表,只需按照g.d.d.c的建议将其汇总即可。不起作用。那就是:
uniques = set( a + b + c )
打ic的原因是您必须具体引用列表a
,b
和c
。 Ivc的答案非常好,可以使我们更紧密:
set().union(a, b, c)
但同样,您必须明确引用列表。
解决方案
要从具有任意长度的列表列表中获取唯一值,可以使用positional expansion:
import random
abc, values = [], ["a", "b", "c", "d"]
for i in range(3):
l = []
for j in range(3):
l.append(values[random.randint(0, len(values) - 1)])
abc.append(l)
# The Important Line Below
unique = set().union(*abc)
print(unique)
这将返回无序的适当值(例如["d", "b", "a", "d"]
)