15

我对 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])
4

4 回答 4

19

您可能只需要设置:

>>> 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])
>>>
于 2013-04-04T04:42:43.240 回答
5

如果您不关心它们是否按原始顺序排列,那么最简单且可能最快的方法是使用 set 函数:

>>> set().union(a, b, c)
{1, 2, 3, 4, 5, 6, 7, 8}

如果您确实关心原始顺序(在这种情况下集合恰好保留它,但不能保证),那么您可以通过意识到参数lists包含您传入的所有原始列表的元组来修复您的原始尝试. 这意味着对它进行迭代会一次获得每个列表,而不是其中的元素-您可以使用 itertools 模块解决此问题:

for x in itertools.chain.from_iterable(lists):
   if x not in newlist:
      newlist.append(x)

此外,您可能希望newlist从一个空列表开始,而不是输入列表的副本。

于 2013-04-04T04:54:34.237 回答
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)
于 2013-04-07T05:22:09.083 回答
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)

如果您正在使用列表列表,那么简单地按照 gddc 的建议将它们相加是行不通的。那是:

uniques = set( a + b + c )

打嗝来自您必须专门引用列表abc. Ivc 的回答非常好,让我们更接近:

set().union(a, b, c)

但同样,您必须明确引用您的列表。

解决方案

要从任意长度的列表列表中获取唯一值,可以使用位置扩展

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"]

于 2018-08-09T23:38:09.990 回答