使用列表解析从列表列表中删除重复项

时间:2016-03-13 01:38:13

标签: python list-comprehension

我很好奇你是否可以从列表列表中删除重复项并将uniques作为列表返回。我正在尝试这个:

def do_list( lists ):
    res = [ [ one for one in temp if one not in res ] for temp in lists ]
    return res

例如,如果:

lists = [ [ "a","b","c" ],[ "d","a" ],[ "c","a","f" ] ]

结果应该是:

[ "a","b,"c","d","f" ]    

但它给了我错误,我在分配之前参考变量res。

3 个答案:

答案 0 :(得分:7)

你可以这样做:

set(itertools.chain.from_iterable(lists))

set将删除所有重复内容,set内部只是将您的列表展平为单个列表。

答案 1 :(得分:2)

您收到错误,因为您在理解中引用了-(defun mc/mark-all-in-region (beg end) +(defun mc/mark-all-in-region (beg end &optional search) "Find and mark all the parts in the region matching the given search" (interactive "r") - (let ((search (read-from-minibuffer "Mark all in region: ")) + (let ((search (or search (read-from-minibuffer "Mark all in region: "))) (case-fold-search nil)) (if (string= search "") (message "Mark aborted") 。这不起作用,因为res仅在表达式完成后可用。

由于我很好奇,并且因为标题要求“使用列表理解从列表列表中删除重复”,我想看看你是否可以使用 列表理解来做到这一点,而不是作弊,例如使用res:p

以下是:

itertools

为了获得更多精神错乱,您可以将它们组合在一条线上,但您必须重复>>> lists = [ [ "a","b","c" ],[ "d","a" ],[ "c","a","f" ] ] >>> lists2 = sorted(sum(lists, [])) >>> [ item for i, item in enumerate(lists2) if i == 0 or i == len(lists2) or lists2[i - 1] != item ] ['a', 'b', 'c', 'd', 'f'] sum()次来电。我无法动摇自己编写如此丑陋的代码; - )

  • sorted()会使列表变得扁平;它返回sum(lists, [])中所有项目的总和(+运算符),其中lists为初始列表。
  • []将对其进行排序。这是必需的,因为我们只检查最后一项
  • sorted()语句检查前一项是否与当前项相同。

但它是丑陋的和非Pythonic。 对于Guido的爱,请使用Pythonista的答案(或其中的一些变体)!

答案 2 :(得分:1)

在评估整个列表推导之前,

res尚未创建。您可以使用set删除重复项:

res = list(set(sum(lists, [])))

如果你想要它排序:

res = sorted(set(sum(lists, [])))

如果你想要它的确切排序,列表理解可能不是最好的方法。相反,这样做:

res = []
for temp in lists:
    res.append([])
    for one in temp:
        if one not in res[-1]:
            res[-1].append(one)